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

2024-06-16 11:18:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个问题-我正在使用selenium(firefox)web驱动程序打开一个网页,单击一些链接等,然后捕获一个屏幕截图。

我的脚本在CLI中运行良好,但是当通过cronjob运行时,它不会通过第一个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()

我是一个有点像Python的人,所以我有点和语言斗争。。。

A)如何检查链接是否被python实际获取?我应该使用try/catch块吗?

B)是否有比链接文本更好/更可靠的方法来定位DOM元素?E、 g.在JQuery中,可以使用更具体的选择器$('a.lnk:contains(log In)')。do_something()


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

我还是想知道如何检查元素是否存在。另外,一个隐式/显式等待的例子/解释,而不是使用一个糟糕的time.sleep()调用。

干杯,ns


Tags: 方法textin脚本log元素by链接
3条回答

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

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

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

解决方案之一:

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

对于后续问题,使用try/catch可以判断元素是否存在,并且可以在这里找到很好的等待示例:http://seleniumhq.org/docs/04_webdriver_advanced.html

(一)

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-最可靠的。此外,您可以将xpath作为贯穿所有脚本的标准,并创建上面提到的通用函数。

更新:我在4年前写下了最初的答案,当时我认为xpath是最好的选择。现在我建议使用css选择器。我仍然建议不要混合/使用“按id”、“按名称”等,而是使用一种单一的方法。

提供的解决方案对我来说都不容易,所以我想补充一下自己的方法。

基本上,您得到的是元素列表,而不是元素,然后计算结果;如果它为零,则它不存在。示例:

if driver.find_elements_by_css_selector('#element'):
    print "Element exists"

注意find_elements_by_css_selector中的“s”以确保它是可数的。

编辑:我正在检查列表的len(,但最近我了解到空列表是错误的,因此根本不需要获取列表的长度,只需留下更简单的代码。

另外,另一个答案是使用xpath更可靠,但事实并非如此。见What is the difference between css-selector & Xpath? which is better(according to performance & for cross browser testing)?

相关问题 更多 >