有时你想对页面中可能存在或不存在的对象进行操作,显然你只想在页面上存在对象时执行操作,但是如果对象不存在则是也没关系,但你不希望自动化中断。现在,我一直以两种不同的方式处理这种情况:
使用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)
答案 0 :(得分:2)
我相信您正在研究明确/隐含的等待情况。
http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp
Selenium允许您在进行测试时更改隐式等待,以更改您希望等待元素显示的时间。从技术上讲,如果你不想让你的测试失败,你可以将它改为0有一个救援条款。
答案 1 :(得分: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
这应该会显着减少您尝试查找不在DOM中的元素的次数(假阴性)。当然,如果元素是动态添加到客户端的DOM(使用Javascript),那么你可能会在它实际存在的时候撤销尝试(假阳性)。
因此,在选择应用此方法之前,您应该仔细检查网页...