Chrome 驱动程序在 FindElement 调用时抛出脚本结果错误
昨天将 Chrome 浏览器更新至 76.0.3809.87 版并将 Chrome 驱动程序更新至 76.0.3809.68 版后,我们在使用
FindElements
、
FindElementByXPath
和
FindElement
方法时,在一组网站上遇到了奇怪的异常。更新前没有发生此问题。抛出的异常是:
unknown error: script returns unexpected result.
目前我的项目自动化了大约 500-600 个网站,我们只在 3 个网站上遇到了这个问题(到目前为止):
- https://billing.clarksvillegw.com/iwr/user/login.seam
- https://mwsonline.nashville.gov/iwr/user/login.seam
- https://webconnect.greensboro-nc.gov/iwr/user/login.seam
这些网站都是由同一家公司建立的,因此代码是可比的。使用
FindElementById
方法时,不会抛出此异常。您为方法提供什么 XPath 似乎也不重要,每次都会抛出异常。我尝试使用全新安装的 selenium 创建新项目,结果相同。
我确信这与 Chrome 驱动程序更新有关,也与我搜索过但未找到的
FindElements
的实际实现有关。我猜是后端使用了一些 javascript,无法与网站很好地兼容。
我尚未尝试使用其他驱动程序重现此问题。鉴于我们的一些项目限制,我们目前无法使用 Chrome 驱动程序以外的任何驱动程序。
搜索此问题没有结果,因为这是一个新问题。搜索异常消息只会得到有关错误使用
ExecuteScript
的信息,这(我认为)与我的问题无关。
有人知道是什么原因导致网站上出现这种情况吗?或者是否有已知的解决方法?在针对此问题提交帮助单之前,我只想确保我没有做导致此问题的任何特定操作。
try
{
var driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://billing.clarksvillegw.com/iwr/user/login.seam");
var success = driver.FindElementsById("login:usernamedec:username").Any();
var failure = driver.FindElementsByXPath("//*[@id='login:usernamedec:username']").Any();
}
catch (Exception)
{
throw;
}
使用上述代码时,
success
计算正确,但尝试计算
failure
时,代码会引发异常。
在我们的测试自动化服务器上​​将 Chrome 浏览器和 ChromeDriver 升级到 76.0.3809.87 后,在 ruby​​ 上运行 Selenium-Webdriver 和 Appium,我遇到了完全相同的错误。
已经缩小了问题的原因并最终从下面的方法返回了错误 - 当调用具有行/列引用的表对象时,即。
`execute_script("arguments[0].scrollIntoView({block: 'center'});", self.sales_table_element[ref][@ref_col])`
`def row_items
meth = strategy == :descendants ? :trs : :rows
@row_items ||= element.send(meth).map do |obj|
::PageObject::Elements::TableRow.new(obj)
end
end`
解决方法: 将 Chrome-Driver 降级到 75.0.3770.140 即可解决我的问题
从现在起,这是一个临时解决方案。希望此问题能尽快得到永久修复!
更新: 将 ChromeDriver 和 Chrome 浏览器都升级到 77.0.3865.40 可解决此问题。- 另请参阅, https://chromedriver.storage.googleapis.com/77.0.3865.40/notes.txt
此问题在 此处 中有描述,在测试页面使用prototypejs v1.6.1时重现。
相应的错误在 此处 (现已关闭),并将于下周(2019年8月26日之后)发布到chromedrivers v76、v77的新版本中。仅供参考:chromedrivers的当前版本是:76.0.3809.68和77.0.3865.10
使用以前的驱动程序版本应该可以,使用chromedriver v75你应该有仅警告“当前版本未经测试”。但对于 v74,您需要使用
--disable-build-check
使用之前的 chromedriver (75.0.3770.140) 对我来说不起作用。有人有其他解决方案吗?