【发布时间】:2014-03-16 08:58:25
【问题描述】:
带有 Python 绑定的 Webdriver v2.39.0 Firefox 27.0(但问题也与 Firefox 'latest'、Firefox 26.0 和 Firefox 27.0 一起重现)
在下面的代码中,一旦针对某个页面上的链接执行obj.click(),浏览器就会挂起。如果在终端 (Windows) 中使用 Ctrl+C 终止脚本,则浏览器将停止挂起。如果留给它自己的设备,浏览器似乎会无限期地挂起。
我不确定是否允许我发布问题页面的 HTML,但我可以与我的团队协商。
这个非常相同的代码曾经完美地与现在导致问题的相同元素一起工作。我怀疑这与自动升级 Firefox 有关,但降级并没有解决问题(请参阅我尝试过的部分了解更多详细信息和我尝试过的事情)
def wait_and_click(obj_id, timeout=global_timeout, locator_attribute = 'ID'):
print('waiting for ' + obj_id)
obj = WebDriverWait(driver, timeout).until(EC.element_to_be_clickable((eval('By.' + locator_attribute), obj_id)))
print("about to click object")
obj.click()
print("about to return from wait_and_click")
return obj
我尝试过的事情:
- 手动复制问题(无浏览器挂起)
- 尝试降级到不同版本的 Firefox 并卸载所有扩展程序
- 如果 obj_id 等于问题元素,则尝试跳过 obj.click - 浏览器不会挂起(但脚本不会去任何地方:p 因为需要单击某些内容)
- 为页面上的元素尝试了更常规的 WebDriverWait 然后 find_element_by_xpath - 同一浏览器挂起
- 尝试通过不同的属性定位元素(最初尝试使用 LINK_TEXT,也尝试通过 XPATH - 没有区别),然后单击
- 尝试在同一页面上查找不同的链接 - 同一浏览器挂起
- 尝试在同一个 Web 应用的不同页面上查找链接 - 没有浏览器挂起
- 尝试保存包含链接的页面的来源以及链接指向的页面的来源。我让 webdriver 打开页面的本地副本并单击问题链接 - 目标页面打开时没有浏览器挂起
【问题讨论】:
-
点击时对象是否存在?因为等待超时,如果它达到超时,你可能会在没有对象的情况下通过那里(我猜)。
-
如果超时,我不会收到 ElementNotFound 或 TimeoutException 错误吗?或者类似的东西会导致执行终止(不是浏览器停止工作?)另外,我知道它正在到达 obj.click 因为“即将单击对象”正在打印到控制台。
-
你是对的,根据文档,如果找不到元素,它应该抛出异常。您是否尝试过手动复制问题(只需单击浏览器中的元素,或通过控制台触发单击)?至于是否发布 html,您可以从尽可能多地从页面中剥离,这将有助于缩小问题范围,并在您确实需要共享 html 时减少问题。
-
是的,我已尝试手动重现该问题,但问题并未显现。我已将它添加到我的“我尝试过的事情”列表中。剥离 html 的好主意 :) 我以前从未这样做过。我想我可以保存页面源并让 webdriver 打开源的本地副本并从那里进行实验。这就是你的想法吗?
-
无论您是否想到了,我都尝试在本地运行这些页面,并且链接工作正常。所以看起来它与应用服务器提供页面的方式和 webdriver 之间的交互有关。但我不知道下一步该做什么
标签: python firefox selenium selenium-webdriver skype