【问题标题】:How to check if object exists (Selenium/Python) and execute if-else如何检查对象是否存在(Selenium/Python)并执行 if-else
【发布时间】:2018-06-08 03:23:11
【问题描述】:

我正在尝试创建脚本以自动输入订单。我正在为客户搜索结果而苦苦挣扎。我写了以下 if 语句:

# checks if there are any search results
if browser.find_element_by_css_selector("a[class='nclk']"):

    # creates variable with all search results
    searchCount = browser.find_elements_by_xpath("//a[@class='nclk']") 

    # counts search results
    searchCountCheck = len(searchCount) 
    ...

它查找"a[class='nclk']",因为如果有任何搜索结果,则该对象存在。问题是,如果没有,它会停止脚本并显示错误消息...unable to locate element... - 它不会转到 else 语句,我不知道如何对其进行排序。

我知道这可以由try: 完成,但问题是这两个内部嵌套了许多语句,因此最终会变得一团糟。

我认为处理此问题的最佳方法是创建一个 try 语句来检查此类对象是否存在并创建变量(哪个值取决于对象的存在)-但我不知道如何编写它以及如何将变量传递给以下 if-else 语句。

【问题讨论】:

标签: python selenium


【解决方案1】:

你可以用这个:

# if result is 0, then there is no element matching.
driver.find_elements_by_css_selector('#element')  

在这种情况下,您不必添加try,因为如果没有元素,列表的长度将为0,并且不会抛出任何错误。在你的情况下,它会是这样的:

if (browser.find_elements_by_css_selector("a[class='nclk']")):
  searchCount = browser.find_elements_by_xpath("//a[@class='nclk']")
  searchCountCheck = len(searchCount)

【讨论】:

  • 如果我只使用 'browser.find_element_by_css_selector("a[class='nclk']")' 那么它只会给我错误消息并停止执行脚本,即使它应该转到 else 语句并执行那里定义的所有东西 - 相反 - 它只是停止。
  • 是的,但我建议你使用find_elements_by 而不是find_element_by
  • 干杯伙伴!一个's'改变了一切:)。再次感谢您!
  • find_elements_by 给出一个列表,如果列表为空,if 语句将返回false
  • @ugabuga77 没问题。祝你有美好的一天!
【解决方案2】:

编辑:

我忘记了 find_elements_by_xpath() 返回一个空或非空列表,但这个解决方案对各种 find_element_by_* 函数都有好处。


您可以做的是使用try-except-else 语句。例如,

try:
    searchCount = browser.find_element_by_xpath("//a[class='nclk']")
    searchCountCheck = len(searchCount)
except NoSuchElementException: 
    print("No element found. Breaking...")
except: 
    print("Generic error message.")
else:
    # Do stuff with searchCount / searchCountCheck / etc.

只有在try 部分没有抛出错误时,才会输入else 部分。

【讨论】:

    【解决方案3】:

    异常后可以将 searchCountCheck 设置为 0。

    try:
        browser.find_element_by_css_selector("a[class='nclk']")
        searchCount = browser.find_elements_by_xpath("//a[@class='nclk']")
        searchCountCheck = len(searchCount)
        flag = 1
    except NoSuchElementException:
        searchCountCheck = 0
        flag = 0
    

    find_element_by_css_selector(css_selector) 通过css查找元素 选择器。

    Args:css_selector - CSS 选择器字符串,例如:'a.nav#home' 返回:
    WebElement - 如果找到的元素引发:
    NoSuchElementException - 如果未找到该元素 用法:element = driver.find_element_by_css_selector(‘#foo’)

    【讨论】:

    • 有没有办法使用'try:'方法来创建变量并根据这个元素的存在给它赋值?所以说如果元素存在 var check 得到 1,如果不存在它得到 0,然后我将这个 var(及其分配的值)传递给 if-else 语句?
    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多