Selenium与Metamask钱包及DApp交互及验证码破解汇总

1.LavaMoat报错:

selenium.common.exceptions.WebDriverException: Message: unknown error: Runtime.callFunctionOn threw exception: Error: LavaMoat...`

报错原因:

根本原因是Metamask为了用户钱包安全,而将LavaMoat 设置为了全局不可用。
报错解析文章链接:
https://github.com/MetaMask/metamask-extension/issues/19018
Runtime.callFunctionOn threw exception: Error: LavaMoat - property “Proxy” of globalThis is inaccessible under scuttling mode
https://stackoverflow.com/questions/76252205/runtime-callfunctionon-threw-exception-error-lavamoat-property-proxy-of-gl

解决办法:

修改 metamask 中的安全机制逻辑
安装 CRX Extractor/Downloader
打开页面 https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn
页面中,点击工具栏中 CRX Extractor/Downloader 使用插件下载 zip 格式的 metamask 包
将下载的 zip 解压,vscode 打开,找到并将 runtime-lavamoat.js 文件第 93 行的 scuttleGlobalThis 改为false 保存
在将 metamask 压缩成 zip (就是普通的压缩)
打开 chrome://extensions/ 页面,将 zip 文件拖进来,重新安装;
如果上一步报错了,可使用 加载已解压的扩展程序, 手动选择下载的修改过 metamask 文件夹,进行加载
需要注意的是这种方式安装的 ext ,对应的 ID 会有变化的, 也就是 chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/home.html driver.get() 要换成新的。

参考链接:https://blog.csdn.net/u013948858/article/details/130723828

2.报错:selenium使用可用的IP代理地址,仍然无法连接。webdriver添加正确ip代理依然访问失败。

《!!!!该解决办法是错误的!!!!详细请下拉看第8个!!!!》

报错原因:暂不清楚
解决方法:

import requests
from selenium import webdriver

url="https://www.baidu.com/"
ip="114.96.199.198"
port = "4325"

proxy={
   "http":"http://"+ip+":"+port}
headers={
   "User-Agent":"Mozilla/5.0"}
res=requests.get(url,proxies=proxy,headers=headers)
print(res.status_code)  # 返回200:表示该ip代理是可用的
print('------------------')

chrome_path = '/Users/dannihong/downloads/webdriver_browser/chromedriver86'
options=webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://'+ip+":"+port)
options.add_argument('--proxy-server=http://114.96.199.198:4325')  # 必须是中文冒号
driver=webdriver.Chrome(executable_path=chrome_path, chrome_options=options)
driver.get(url)

options.add_argument()里的参数端口冒号,改为中文的冒号,一下子就访问成功了。
这应该是目前遇到的最奇怪的错误了😄

参考文章:https://www.cnblogs.com/hongdanni/p/13907115.html

3.selenium与chrome扩展弹窗交互问题

这个是最头疼的,找了一天才找到解决方案,最后发现网上的几个方案都不可行,而且使用webdriver控制chrome导入未打包的metamask钱包时,ID和本机已安装的chrome导入该包时的ID是不一样的,导致driver.get()时会报错。以下展示网上搜集的3种方案,只有方案3可行。

'''
    方案1:
    popup = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="popup"]')))
    popup.click()
    ## 已证实不可行
    '''

    '''
    # 方案2:
    driver.execute_cdp_cmd("Target.sendMessageToTarget", {"message": "下一步"}, targetId=r'einnkkjhebeeofefmappiomndlojekaj')
    time.sleep(3)
    driver.execute_script("document.getElementById('button').click();")
    time.sleep(3)
    driver.execute_cdp_cmd("Target.sendMessageToTarget", {"message": "连接"}, targetId=r'einnkkjhebeeofefmappiomndlojekaj')
    time.sleep(3)
    driver.execute_script("document.getElementById('button').click();")
    ## 已证实不可行
    '''

    # 方案3
    driver.switch_to.window(driver.window_handles[1])
    driver.get('chrome-extension://einnkkjhebeeofefmappiomndlojekaj/popup.html')
    time.sleep(5)
    driver.find_element(By.XPATH, '//button[@data-testid="page-container-footer-next"]').click()
    time.sleep(1)
    driver.find_element(By.XPATH, '//button[@data-testid="page-container-footer-next"]').click()
    time.sleep(3)
    driver.find_element(By.XPATH, '//button[@data-testid="popover-close"]').click()
    time.sleep(1)
    ## 该方法可行,但要注意Webdriver导入未打包的metamask时,ID与本机已安装的Chrome的ID不一样。

4. Selenium导致C盘空间爆满

原因:运行缓存
缓存位置:C:\Windows\SystemTemp (windows系统)
解决办法:删光该文件内的文件即可
在这里插入图片描述

** 5.报错:WebDriver‘ object has no attribute “find_element_by_xpath”

selenium最新版本中,‘find_element_by_xpath’方法已经停用,改用driver.find_element(By.XPATH, “”)

参考文章:
解决‘WebDriver‘ object has no attribute ‘find_element_by_xpath‘问题
https://blog.csdn.net/weixin_43777074/article/details/125994736

**6.报错:

selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain driver for MicrosoftEdge using Selenium Manager.; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location

错误原因及解决办法
python的启动目录下面,我放有一个chromedriver.exe的文件,然后我项目的路径下面,也放有一个chromedriver.exe的文件。然后我代码指向的是项目路径下的chromedriver.exe。然后就会报错,我把项目本身的chromedriver.exe给删除掉,然后代码那边不填写路径。就可以了

参考文章:
selenium打开浏览器报错成功解决selenium.common.exceptions.NoSuchDriverException: Message: Unable to obtain…
https://blog.csdn.net/sinnp/article/details/132330998?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-132330998-blog-134330977.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-132330998-blog-134330977.235%5Ev43%5Epc_blog_bottom_relevance_base7&utm_relevant_index=2

7.selenium反反爬:

# 配置浏览器,添加插件
def ChromeSet():
    IP_this = GetIP()
    user_ag = UserAgent()
    print(user_ag, '\n', IP_this)
    # 浏览器配置设置
    EXTENSION_PATH = r'D:\wallet\MetaMask.crx '
    opt = webdriver.ChromeOptions()
    opt.add_argument('disable-infobars')  # 隐藏"Chrome正在受到自动软件的控制"
    opt.add_argument('--proxy-server=' + IP_this)
    opt.add_argument('--user-agent=' + user_ag)
    # 设置为开发者模式,避免被识别
    opt.add_experimental_option('excludeSwitches', ['enable-automation'])
    opt.add_extension(EXTENSION_PATH)

    # 加载配置
    driver = webdriver.Chrome(options=opt)
    driver.delete_all_cookies()  # 删除所有的cookie
    # driver.add_cookie({'name': 'ABC', 'value&
  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于使用 Python 和 Selenium 进行与 Metamask交互,您可以按照以下步骤进行操作: 1. 安装 Selenium 和相应的浏览器驱动: - 首先,确保您已经安装了 Python。您可以从官方网站(https://www.python.org)下载并安装最新版本的 Python。 - 然后,使用以下命令来安装 Selenium: ``` pip install selenium ``` - 接下来,根据您使用的浏览器选择相应的驱动程序,例如 Chrome 驱动程序(ChromeDriver)。下载并将驱动程序添加到系统路径中。 2. 编写 Python 脚本: - 导入所需的库: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC ``` - 配置浏览器选项(例如,启用 MetaMask 插件): ```python options = Options() options.add_extension('path_to_metamask_extension') # 替换为 MetaMask 插件的路径 ``` - 启动浏览器并打开网页: ```python driver = webdriver.Chrome(options=options) # 使用 Chrome 浏览器 driver.get('https://example.com') # 替换为您要访问的网页链接 ``` - 等待元素加载并与 MetaMask 进行交互: ```python # 等待 MetaMask 弹窗出现 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, 'xpath_of_metamask_popup'))) # 替换为 MetaMask 弹窗的 XPath # 在弹窗中选择账户/网络等 # 您可以使用 Selenium 提供的方法,例如 find_element_by_xpath()、find_element_by_id() 等来定位元素并与之交互 ``` - 关闭浏览器: ```python driver.quit() ``` - 完整示例代码如下: ```python from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC options = Options() options.add_extension('path_to_metamask_extension') driver = webdriver.Chrome(options=options) driver.get('https://example.com') WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, 'xpath_of_metamask_popup'))) # 进行 MetaMask 相关操作 driver.quit() ``` 请确保将上述代码中的 `path_to_metamask_extension` 替换为 MetaMask 插件的实际路径,`https://example.com` 替换为您要访问的网页链接,以及 `'xpath_of_metamask_popup'` 替换为 MetaMask 弹窗的实际 XPath。 希望这能帮到您!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爬吧爬吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值