即使元素在 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 中不起作用?