使用 Python Selenium 检查元素是否存在

新手上路,请多包涵

我有个问题;我正在使用 Selenium (Firefox) 网络驱动程序打开网页,单击几个链接等,然后捕获屏幕截图。

我的脚本在 CLI 中运行良好,但是当通过 cron 作业 运行时,它没有通过第一个 find_element() 测试。我需要添加一些调试,或帮助我找出失败原因的东西。

基本上,在进入登录页面之前,我必须单击“登录”锚点。元素的构造是:

 <a class="lnk" rel="nofollow" href="/login.jsp?destination=/secure/Dash.jspa">log in</a>

我正在使用 find_element By LINK_TEXT 方法:

 login = driver.find_element(By.LINK_TEXT, "log in").click()

A) 我如何检查链接是否真的被 Python 拾取了?我应该使用 try/catch 块吗?

B) 是否有比 LINK_TEXT 更好/更可靠的定位 DOM 元素的方法?例如,在 jQuery 中,您可以使用更具体的选择器 $(‘a.lnk:contains(log in)’).do_something();


我已经解决了主要问题,这只是手指的麻烦。我用不正确的参数调用脚本 - 一个简单的错误。

我仍然想要一些关于如何检查元素是否存在的指示。此外,还有一个隐式/显式等待的示例/解释,而不是使用糟糕的 time.sleep() 调用。

原文由 nonshatter 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

A)是的。检查元素是否存在的最简单方法是在 find_element try/catch

B) 是的,我总是尝试在不使用文本的情况下识别元素,原因有二:

  1. 文本更有可能发生变化;
  2. 如果它对您很重要,您将无法针对本地化构建运行测试。

解决方案是:

  1. 您可以使用 XPath 查找具有 ID 或某些其他唯一标识符的父元素或祖先元素,然后找到匹配或的子元素/后代元素;
  2. 您可以请求链接本身的 ID 或名称或其他一些唯一标识符。

对于后续问题,使用 try/catch 是判断元素是否存在的方法,可以在此处找到等待的好例子: http://seleniumhq.org/docs/04_webdriver_advanced.html

原文由 Sam Woods 发布,翻译遵循 CC BY-SA 4.0 许可协议

为一个):

 from selenium.common.exceptions import NoSuchElementException
def check_exists_by_xpath(xpath):
    try:
        webdriver.find_element_by_xpath(xpath)
    except NoSuchElementException:
        return False
    return True

对于 b):此外,您可以将 XPath 表达式作为贯穿所有脚本的标准,并创建上述通用函数。

我推荐使用 CSS 选择器。我建议不要混合/使用“按 ID”、“按名称”等,而是使用一种方法。

原文由 Alex Okrushko 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题