selenium等待方式
直接等待 [不推荐]
强制等待,线程休眠一定的时间。
time.sleep(3)
实例:打开测试人网页,点击“所有分类”,检查该按钮的源码,以title作为定位器;检查“热门”按钮的源码,以title作为定位器
用 “所有分类” 的xpath作为定位器。这里是://*[@title="所有分类"]
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
class TestWait:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get('https://ceshiren.com/')
# 直接等待
def test_wait(self):
# 用 “所有分类” title的xpath作为定位器。这里是://*[@title="所有分类"]
self.driver.find_element(By.XPATH,'//*[@title="所有分类"]').click() #点击"所有分类"
sleep(3)
self.driver.find_element(By.XPATH,'//*[@title="在最近的一年,一月,一周或一天最活跃的话题"]').click() #点击 "热门"
sleep(3)
print("hello")
隐式等待
隐式等待,设置一个等待时间,轮询查找(默认0.5秒)元素是否出现。若在所给时间内出现了,就自动跳出死循环;如果到时间没有出现,则抛出异常。
self.driver.implicity_wait(3)
但是,隐式等待作用域:全局的
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
class TestWait:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get('https://ceshiren.com/')
# 添加动态等待:隐式等待
self.driver.implicitly_wait(3)
def test_wait(self):
self.driver.find_element(By.XPATH, '//*[@title="所有分类"]').click() # 点击"所有分类"
self.driver.find_element(By.XPATH, '//*[@title="在最近的一年,一月,一周或一天最活跃的话题"]').click() # 点击 "热门"
显式等待
在代码中定义等待条件,当条件发生时才会继续执行代码
'WebDriverWait'配合 until( )和 until_not( )方法使用,根据判断条件进行等待
程序每隔一段时间(默认时间是0.5秒)进行条件判断。如果条件成立,则执行下步操作;否则继续等待,直到超过设置的最长时间。
自定义等待函数:
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
class TestWait:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get('https://ceshiren.com/')
def test_wait(self):
self.driver.find_element(By.XPATH, '//*[@title="测试答疑"]').click() # 点击"测试答疑"
"""自定义函数,一定要有一个参数。因为until调用wait时传给它一个参数"""
def wait(x):
# 点击“测试答疑”后,检查“回复”有没有出现?如果出现了,就下一步操作:点击“热门”;如果没有就一直等待
return len(self.driver.find_elements(By.XPATH,'//*[@class="posts sortable num"]')) >= 1
WebDriverWait(self.driver,10).until(wait)
self.driver.find_element(By.XPATH, '//*[@title="在最近的一年,一月,一周或一天最活跃的话题"]').click() # 点击 "热门"
我们不用每次都自定义一个等待函数,可以使用selenium自带的函数来设置等待。
例如:用selenium提供的:直到元素可点击expected_conditions.element_to_be_clickable()方法。只需往里传一个定位器locator。
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
class TestWait:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get('https://ceshiren.com/')
# 添加动态等待:隐式等待
# self.driver.implicitly_wait(3)
def test_wait(self):
self.driver.find_element(By.XPATH, '//*[@title="测试答疑"]').click() WebDriverWait(self.driver,10).until(expected_conditions.element_to_be_clickable((By.XPATH,
'//*[@class="posts sortable num"]')))
self.driver.find_element(By.XPATH, '//*[@title="在最近的一年,一月,一周或一天最活跃的话题"]').click() # 点击 "热门"