Python 单击链接后如何阻止Firefox挂起?

Python 单击链接后如何阻止Firefox挂起?,python,firefox,selenium,selenium-webdriver,skype,Python,Firefox,Selenium,Selenium Webdriver,Skype,带有Python绑定的Webdriver v2.39.0 Firefox 27.0(但本期也转载了Firefox“最新版本”、Firefox 26.0和Firefox 27.0) 在下面的代码中,一旦执行点击某个页面上的链接,浏览器就会挂起。如果在终端(Windows)中使用Ctrl+C终止脚本,浏览器将停止挂起。如果任由它自己的设备使用,浏览器似乎会无限期地挂起 我不确定是否允许我发布问题页面的HTML,但我可以与我的团队协商 这段代码曾经与现在导致问题的元素完美配合。我曾怀疑这与Firefo

带有Python绑定的Webdriver v2.39.0 Firefox 27.0(但本期也转载了Firefox“最新版本”、Firefox 26.0和Firefox 27.0)

在下面的代码中,一旦执行点击某个页面上的链接,浏览器就会挂起。如果在终端(Windows)中使用Ctrl+C终止脚本,浏览器将停止挂起。如果任由它自己的设备使用,浏览器似乎会无限期地挂起

我不确定是否允许我发布问题页面的HTML,但我可以与我的团队协商

这段代码曾经与现在导致问题的元素完美配合。我曾怀疑这与Firefox的自动升级有关,但降级并没有解决问题(请参阅“我尝试过的事情”一节了解更多详细信息和我尝试过的事情)

我尝试过的事情:

  • 手动复制问题(无浏览器挂起)
  • 尝试降级到不同版本的firefox并卸载所有扩展
  • 如果obj_id等于问题元素,则尝试跳过obj.click-浏览器未挂起(但脚本不会挂起:p,因为需要单击某些内容)
  • 为页面上的某个元素尝试了更传统的WebDriverWait 然后通过xpath查找元素-相同的浏览器挂起
  • 尝试通过其他属性定位元素(最初尝试使用LINK_TEXT,也尝试通过XPATH-无差异),然后单击
  • 尝试在同一页上查找不同的链接-同一浏览器挂起
  • 尝试在同一web应用的不同页面上查找链接-无浏览器挂起
  • 已尝试保存包含链接的页面的源以及链接指向的第页的源。我让webdriver打开该页面的本地副本,然后单击问题链接-目标页面在没有浏览器挂起的情况下打开

Argh,这是一个令人沮丧的解决方案-似乎是因为Skype工具栏是在最新的Firefox升级中自动安装的

值得注意的是,它不会轻易消失。如果您转到Firefox->Extensions,它只允许您禁用它。你必须转到“程序和功能”并从那里卸载它。在那之后,它就像一个符咒


微软

单击时对象是否存在?因为等待有一个超时,如果它达到了超时,你可能会在没有对象的情况下通过它(我猜)。如果它达到了超时,我不会得到ElementNotFound或TimeoutException错误吗?或者类似的东西会导致执行终止(而不是浏览器停止工作?)此外,我知道它正在进入obj。单击是因为“即将单击对象”正在打印到控制台。您是对的,根据文档,如果找不到元素,它应该抛出异常。您是否尝试过手动复制问题(只需单击浏览器中的元素,或通过控制台触发单击)?至于是否发布html,你可以从尽可能多的页面剥离开始,这将有助于缩小问题的范围,如果你确实需要共享html,那么问题就不会那么严重了。是的,我尝试过手动复制问题,但问题没有表现出来。我已将其添加到我的“我尝试过的事情”列表中。剥离html的好主意:)我以前从未这样做过。我想我可以保存页面源代码,让webdriver打开源代码的本地副本并从那里进行实验。这就是你的想法吗?不管你是否有这个想法,我试着在本地运行这些页面,链接运行得很好。因此,它似乎与应用服务器为页面提供服务的方式和webdriver之间的交互有关。但我不知道下一步该怎么办
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