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

2025-02-27 09:05:00
admin
原创
77
摘要:问题描述:我有一个问题;我正在使用 Selenium(Firefox)网络驱动程序打开网页、单击几个链接等,然后捕获屏幕截图。我的脚本在 CLI 中运行良好,但通过cron 作业运行时,它无法通过第一个 find_element() 测试。我需要添加一些调试或其他东西来帮助我找出失败的原因。基本上,我必须单击...

问题描述:

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

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

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

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

我正在使用find_element通过 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() 调用。


解决方案 1:

对于 a):

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”、“按名称”等,而应使用单一方法。

解决方案 2:

您可以抓取元素列表,而不是单个元素。python 中的空列表为 false。示例:

if driver.find_elements(By.CSS_SELECTOR, '#element'):
    print "Element exists!"

你也可以使用By.IDand By.NAME,但这只会将你的 id 或名称转换为 css 选择器。来源

解决方案 3:

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

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

  1. 文本更有可能发生变化;

  2. 如果它对您很重要,您将无法针对本地化版本运行测试。

解决方案可以是:

  1. 您可以使用 XPath 查找具有 ID 或其他唯一标识符的父元素或祖先元素,然后找到匹配的子元素/后代元素;

  2. 您可以为链接本身请求一个 ID 或名称或其他唯一标识符。

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

解决方案 4:

无需 try&catch 且无需新导入的解决方案:

if len(driver.find_elements_by_id('blah')) > 0: # Pay attention: find_element*s*
    driver.find_element_by_id('blah').click # Pay attention: find_element

解决方案 5:

与 Brian相同,但添加了tstempko 的这个答案:

我尝试过并且它很快就起作用了:

driver.implicitly_wait(0)

if driver.find_element_by_id("show_reflist"):
    driver.find_element_by_id("show_reflist").find_element_by_tag_name("img").click()

此后,我恢复默认值:

driver.implicitly_wait(30)

解决方案 6:

你也可以更简洁地使用

driver.find_element_by_id("some_id").size != 0

解决方案 7:

当您知道元素不可能存在时,隐式等待可能是一个问题。我创建了一个简单的上下文管理器来避免这些等待时间

class PauseExplicitWait(object):
    """
    Example usage:

    with PauseExplicitWait(driver, 0):
        driver.find_element(By.ID, 'element-that-might-not-be-there')
    """
    def __init__(self, driver, new_wait=0):
        self.driver = driver
        self.original_wait = driver.timeouts.implicit_wait
        self.new_wait = new_wait
      
    def __enter__(self):
        self.driver.implicitly_wait(self.new_wait)
  
    def __exit__(self, exc_type, exc_value, exc_tb):
        self.driver.implicitly_wait(self.original_wait)
  

解决方案 8:

driver.find_element_by_id("some_id").size()是一种类方法。

我们需要:

driver.find_element_by_id("some_id").size这是一个字典,所以:

if driver.find_element_by_id("some_id").size['width'] != 0:
   print 'button exist'

解决方案 9:

您可以通过可用的方法查找元素,并检查响应数组长度,如果数组长度等于 0,则元素不存在。

element_exist = False if len(driver.find_elements_by_css_selector('div.eiCW-')) > 0 else True

解决方案 10:

使用最新的 Selenium,您现在可以使用.is_displayed()

https://www.selenium.dev/documentation/webdriver/elements/information/

解决方案 11:

您可以像下面这样使用is_displayed() :

res = driver.find_element_by_id("some_id").is_displayed()
assert res, 'element not displayed!'

解决方案 12:

您可以通过find_elements检查。 如果结果为空,则该元素不存在。

if driver.find_elements(By.SOMETHING, "#someselector") == []:
    continue   # That element does not exist

解决方案 13:

A)按照有关网页元素的信息.is_displayed()中的说明使用:

# After navigating to the URL,
# get the Boolean value for if this element is displayed
is_button_visible = driver.find_element(By.CSS_SELECTOR, "[name='login']").is_displayed()

使用“is_button_visible”进行分支继续您的 Visual Studio Code 逻辑。

B)参考Sam Woods 的回答

解决方案 14:

el = WebDriverWait(driver, timeout=3).until(lambda d: d.find_element(By.TAG_NAME,"p"))

文档

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3878  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2714  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   49  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用