如何在元素不存在时不等待地使用Selenium的find_element_by_something函数?
有时候,你可能想对一个对象进行操作,但这个对象可能在页面上,也可能不在。显然,你只想在对象存在时执行这个操作,但如果对象不在也没关系,只是你不希望自动化过程因此中断。目前,我有两种处理这种情况的方法:
第一种是使用一个叫做 find_elements_by_something 的方法,再加上一个 if 语句:
my_var = driver.find_elements_by_xpath(some_xpath)
if len(my_var) > 0:
# the element is present so do the action
第二种是使用 find_element_by_something 方法,再加上一个 try 语句:
try:
my_var = driver.find_element_by_id(some_id)
# do the action
except:
# do something else
这两种方法都能用,但它们有一个大问题,就是会让自动化变得很慢,因为它们都在用驱动程序的超时设置去寻找元素,所以可能需要花费一些时间。
有没有办法在不使用任何超时的情况下尝试查找一个元素呢?如果这个元素在那一瞬间不在也没关系,我不想让 selenium 等待一段时间,我只想知道这个元素是否存在。
解决方案:
根据 @grumpasaurus 的回复
driver.implicitly_wait(0)
try:
my_var = driver.find_element_by_id(some_id)
# do the action
except:
# do something else
driver.implicitly_wait(old_wait_time)
2 个回答
1
你可以在使用上面提到的任何方法之前,先确保这个元素在页面源代码中。
比如:
str1 = 'id="'+some_id+'"'
str2 = "id='"+some_id+"'"
page_source = driver.page_source
if str1 in page_source or str2 in page_source:
try:
my_var = driver.find_element_by_id(some_id)
# do the action
except:
# do something else
这样可以大大减少你去寻找一个其实不在网页结构里的元素的次数(这叫做假阴性)。当然,如果这个元素是通过客户端的JavaScript动态添加到网页上的,那么你可能会在它实际上存在的时候放弃寻找(这叫做假阳性)。
所以在你决定使用这个方法之前,最好仔细检查一下网页...
2
我觉得你在研究显式等待和隐式等待的情况。
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp
Selenium 让你在测试过程中可以调整隐式等待的时间,也就是说你可以设置想等多久才能看到某个元素。其实你可以把这个时间设置为0,但如果这样做的话,最好准备一个备用方案,以免测试失败。