即使元素在 Selenium Python 中不存在,如果元素存在的条件仍然继续

Posted

技术标签:

【中文标题】即使元素在 Selenium Python 中不存在,如果元素存在的条件仍然继续【英文标题】:Condition if element exist still continues even if the element is not existing in Selenium Python 【发布时间】:2022-01-16 08:15:03 【问题描述】:

我有这段代码,如果元素存在,它将打印innerhtml 值:

def display_hotel(self):
    for hotel in self.hotel_data:
        if hotel.find_element(By.CSS_SELECTOR, 'span[class="_a11e76d75 _6b0bd403c"]'):
            hotel_original_price = hotel.find_element(By.CSS_SELECTOR, 'span[class="_a11e76d75 _6b0bd403c"]')
            hotel_original_price = hotel_original_price.get_attribute('innerHTML').strip().replace(' ', '')

            print(f"Original:\t\t\thotel_original_price")

当我继续运行程序时,我得到一个错误

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: "method":"css selector","selector":"span[class="_a11e76d75 _6b0bd403c"]"

我希望如果元素span[class="_a11e76d75 _6b0bd403c"] 不存在,它应该一起跳过,为什么即使在if 块下它仍然试图继续执行代码?我在这里有什么遗漏吗?

【问题讨论】:

只需使用 try 和 except 来捕获错误。 你会在 except 块中编写什么代码?写pass可以吗? 可以这样做或继续。 【参考方案1】:

如果元素丢失,硒驱动程序会抛出异常。 为了使您的代码正常工作,您应该使用find_elements 方法。 它返回与传递的定位器匹配的元素列表。 因此,如果有匹配项,则列表将包含 web 元素,而如果没有匹配项,它将返回一个空列表,而 python 将非空列表视为布尔值True,而空列表是布尔值False。 所以你的代码可能如下:

def display_hotel(self):
    for hotel in self.hotel_data:
        if hotel.find_elements(By.CSS_SELECTOR, 'span[class="_a11e76d75 _6b0bd403c"]'):
            hotel_original_price = hotel.find_element(By.CSS_SELECTOR, 'span[class="_a11e76d75 _6b0bd403c"]')
            hotel_original_price = hotel_original_price.get_attribute('innerHTML').strip().replace(' ', '')

            print(f"Original:\t\t\thotel_original_price")

【讨论】:

这行得通。只是一个后续问题,当我使用 find_elements 时,它似乎在跳过循环中的非退出元素之前搜索整个元素/文档(不完全确定) 我不确定我是否理解你的问题,对不起 让我换个说法,我的意思是它需要相当长的时间才能跳过循环,例如,如果元素 span[class="_a11e76d75 _6b0bd403c"] 不存在,则需要几秒钟才能继续通过下一个循环迭代。但如果span[class="_a11e76d75 _6b0bd403c"] 存在,则可以快速(即时)进入下一个循环迭代。 您是否在代码中定义了driver.implicitly_wait()

以上是关于即使元素在 Selenium Python 中不存在,如果元素存在的条件仍然继续的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 ElementNotInteractableException:元素在 Selenium webdriver 中不可见?

如何通过Selenium和Python按照网站点击文本为LOGIN的元素?

为啥拖放在 Selenium Webdriver 中不起作用?

Selenium - 页面更改后找不到元素,即使它是可见的

org.openqa.selenium.NoSuchElementException 即使元素存在

Selenium3 + Python3自动化测试系列十——调用JavaScript代码