Python Selenium:处理 Webdriver 异常
Posted
技术标签:
【中文标题】Python Selenium:处理 Webdriver 异常【英文标题】:Python Selenium: Handling Webdriver exception 【发布时间】:2020-04-25 20:46:09 【问题描述】:我正在使用 Beautfilsoup 从 Google Play 商店中提取应用相关信息。我正在提取应用程序名称、总体评分、没有人评价该应用程序以及评论者发布的评论。但是,当我运行程序时,它会引发 webdriver 异常例如:当程序尝试从该应用程序('https://play.google.com/store/apps/details?id=com.tudasoft.android.BeMakeup&hl=en&showAllReviews=true')中检索信息时,它会引发错误。这是我的代码:
import bs4 as bs
from selenium import webdriver
driver = webdriver.Chrome(path)
driver.get(url)
soup = bs.BeautifulSoup(driver.page_source, 'html.parser')
我在第三行出现错误,错误的开始是:
---------------------------------------------------------------------------
WebDriverException Traceback (most recent call last)
<ipython-input-270-4e8a1ef443f2> in <module>()
----> 1 soup = bs.BeautifulSoup(driver.page_source, 'html.parser')
错误的结尾是:
(Session info: chrome=79.0.3945.88)
(Driver info: chromedriver=2.41.578706 (5f725d1b4f0a4acbf5259df887244095596231db),platform=Mac OS X 10.15.2 x86_64)
我尝试使用异常处理但没有解决问题谁能指导我如何克服这种情况?
【问题讨论】:
如果您发现您的 Chrome 驱动程序chromedriver=2.41.578706
和 chrome 版本 chrome=79.0.3945.88
不兼容。请先更新您的 chrome 驱动程序并重试。
我认为问题在于评论中的表情符号。起初我遇到了错误,但是当我进入开发工具并删除那些表情符号时,它运行良好。不确定如何以编程方式解决该问题。我读了这个here
【参考方案1】:
此错误消息...
WebDriverException Traceback (most recent call last)
.
(Session info: chrome=79.0.3945.88)
(Driver info: chromedriver=2.41.578706 (5f725d1b4f0a4acbf5259df887244095596231db),platform=Mac OS X 10.15.2 x86_64)
...暗示 ChromeDriver 无法与 Browsing Context 即 Chrome Browser 会话进行通信。
您的主要问题是您使用的二进制文件版本之间的不兼容性,如下所示:
您正在使用 chromedriver=41.0 chromedriver=2.41 的发行说明明确提及以下内容:您正在使用 chrome=79.0 ChromeDriver v79.0 的发行说明明确提及以下内容:支持 Chrome v67-69
支持Chrome 79版
所以 ChromeDriver v2.41 和 Chrome 浏览器 v79.0
之间存在明显的不匹配解决方案
确保:
Selenium 升级到当前级别 Version 3.141.59。 ChromeDriver 已更新到当前的ChromeDriver v79.0.3945.36 级别。 Chrome 已更新至当前 Chrome 版本 79.0 级别。 (根据ChromeDriver v79.0 release notes) 清理你的项目工作区通过你的IDE和重建你的项目只需要依赖。 (仅适用于 Windows 操作系统)使用 CCleaner 工具在您的测试套件执行前后清除所有操作系统杂务。 (仅限 LinuxOS)Free Up and Release the Unused/Cached Memory in Ubuntu/Linux Mint 在执行您的测试套件之前和之后。 如果您的基础 Web Client 版本太旧,请卸载它并发布 Web Client 版本。 进行系统重启。 以非root用户身份执行@Test
。
始终在 tearDown()
方法中调用 driver.quit()
以优雅地关闭和销毁 WebDriver 和 Web Client 实例。
【讨论】:
对于您提到的最后一点,如果我要检索多个 url(使用 for 循环),是否需要在循环结束时使用 driver.quit()(在加载新 url 之前)? @user2293224 始终建议以更简洁的方式开始每个测试,即启动一个新的浏览上下文,在这些情况下,您可以轻松地driver.quit()
。话虽如此,如果您的测试具有依赖性,您可能必须更改您的 Test Architecture 以重用现有会话。在这种情况下,您不能driver.quit()
。 driver.quit()
的简短意义是降低内存使用率。
我按照您的指示:更新了 chrome 驱动程序、selenium,并重新启动了系统。当我运行程序时,它会抛出相同的错误,但有一些不同的细节。这是错误消息的结尾:
(Session info: chrome=79.0.3945.88),这次没有打印webdriver的版本
@user2293224 太好了,所以我们已经解决了您在问题中提到的错误。我们不应该结束这个讨论并在一个新线程中讨论当前的错误吗?以上是关于Python Selenium:处理 Webdriver 异常的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 selenium python 查找包含特定字符串的所有按钮?