Selenium WebDriver 中的WebDriverWait类 (等待)如何使用
WebDriverWait
是 Selenium WebDriver 中的一个类,用于等待直到某个特定的条件被满足。它是在 selenium.webdriver.support.ui
模块中定义的。
WebDriverWait
的基本用法如下:
1 from selenium.webdriver.support.ui import WebDriverWait 2 from selenium.webdriver.support import expected_conditions as EC 3 from selenium.webdriver.common.by import By 4 from selenium.common.exceptions import TimeoutException 5 6 wait = WebDriverWait(driver, 10) # 创建一个等待对象,等待时间不超过10秒 7 element = wait.until(EC.presence_of_element_located((By.ID, 'my-id')))
在上述代码中:
WebDriverWait
接收两个参数:一个 WebDriver 对象和一个秒数。这个秒数表示最大等待时间。如果在指定的时间内条件没有满足,将会抛出一个TimeoutException
。EC.presence_of_element_located
是一个函数,它接收一个定位器(在这个例子中是(By.ID, 'my-id')
)并返回一个元素。如果元素不存在,这个函数会立即返回None
。wait.until
方法接收一个函数作为参数,并返回该函数的返回值。在这个例子中,它等待直到EC.presence_of_element_located
返回一个元素,然后返回这个元素。
除了 EC.presence_of_element_located
,Selenium 还提供了一些其他的等待条件,例如:
EC.visibility_of_element_located
:等待直到元素可见。EC.text_to_be_present_in_element
:等待直到某个文本出现在某个元素中。EC.element_to_be_clickable
:等待直到元素可以点击。
这些等待条件都可以和 WebDriverWait
一起使用,以实现更复杂的等待逻辑。
除了上述的等待条件,Selenium 还提供了一些自定义等待的方式。如果默认的等待条件不能满足需求,可以使用 expected_conditions.custom_condition
创建一个自定义的等待条件。
下面是一个使用自定义等待条件的例子:
1 from selenium.webdriver.support.ui import WebDriverWait 2 from selenium.webdriver.support import expected_conditions as EC 3 from selenium.webdriver.common.by import By 4 from selenium.common.exceptions import TimeoutException 5 6 def my_custom_condition(driver): 7 # 这里可以编写自定义的等待条件 8 return driver.find_element(By.ID, 'my-id').text == 'expected text' 9 10 wait = WebDriverWait(driver, 10) 11 element = wait.until(EC.custom_condition(my_custom_condition))
在上述代码中,my_custom_condition
是一个自定义的等待条件。它接收一个 WebDriver 对象作为参数,并返回一个布尔值。如果返回 True
,则表示满足等待条件,否则表示不满足等待条件。
然后,使用 EC.custom_condition
将自定义的等待条件包装成一个 expected_conditions
的对象。最后,将这个对象作为参数传递给 WebDriverWait
的 until
方法。
使用自定义等待条件可以灵活地满足各种复杂的等待逻辑。可以根据具体的测试场景,编写相应的等待条件,以实现更精确的等待控制。
另外需要了解一个:
# 在此执行,后续的都会有效,作用于全局
# 必须加载完所有页面才执行代码,执行效率低
# 不适合用在数据在ajax的网站中,比如翻页
driver.implicitly_wait(10)
implicitly_wait
和 WebDriverWait
是 Selenium WebDriver 中用于等待的两种不同机制,主要区别在于等待的粒度和灵活性。
implicitly_wait
: 该方法设置了一个全局的等待时间,适用于整个浏览器会话期间。它等待的时间是针对页面中的所有元素,一旦页面加载完成,等待就会结束。如果在设置的时间内找不到元素,则抛出NoSuchElementException
异常。implicitly_wait
更多的是用于解决元素加载时间过长的问题,但是它并不能对特定的元素进行等待。WebDriverWait
: 与implicitly_wait
不同,WebDriverWait
提供了更细粒度的等待机制。它是针对某个特定的元素进行等待,一旦该元素出现,就会执行相应的操作。你可以设置一个特定的等待时间,如果在规定的时间内找不到元素,则会抛出TimeoutException
异常。WebDriverWait
可以对页面中的特定元素进行等待,灵活性更高。
总结来说,implicitly_wait
和 WebDriverWait
都有等待的功能,但是implicitly_wait
是全局的等待设置,对所有元素有效,而WebDriverWait
则是针对特定元素的等待设置,更加灵活。在选择使用哪种等待方式时,需要根据具体的测试需求来决定。