之前有提到过等待函数,等待函数分为:强制等待(sleep)、隐式等待(implicitly_wait),显示等待(WebDriverWait),这次以显示等待方式专门做一次总结,因为我个人是比较喜欢用这种等待方式。
显示等待:指定一个等待条件(元素),在一定时间间隔内检测一次元素,程序会判断在等待时间内条件是否满足条件,如果满足则执行下一步,如果不满足会继续等待,超过时间就会抛出异常
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Firefox()
browser.get('https://www.xx.com/')
user = wait.until(EC.presence_of_element_located((By.ID, 'user')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.search')))
print(user, button)
3.1 显示等待函数应用一
WebDriverWai()一般由 unit()或 until_not()方法配合使用
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver=webdriver.Firefox()
driver.get("https://www.xx.com")
#检测元素id:someId出现为止,表示:10秒内每隔0.5毫秒扫描1次页面变化,直到找到指定的元素
WebDriverWait(driver, 10).until(lambda driver:driver.find_element_by_id("someId"))
#检测元素id:someId不再出现为止,表示:10秒内每隔0.5毫秒扫描1次页面变化,直到找不到指定的元素
WebDriverWait(driver, 10).until_not(lambda driver:driver.find_element_by_id("someId"))
3.2 显示等待函数应用二
通常使用WebDriverWait时,我们还会使用到EC即expected_condition,这里展示了显示等待的几种函数之间的区别
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
#打开谷歌浏览器
driver = webdriver.Chore()
#当隐式等待、显示等待都存在时,超时时间取两者较大者的时间 driver.implicitly_wait(6) #打开网址 driver.get("http://www.xx.com") #判断标题是否为zn,返回布尔值 WebDriverWait(driver,10).until(EC.title_is("zn")) #判断标题是否包含zn,返回布尔值 WebDriverWait(driver,10).until(EC.title_contains("zn")) #判断某个元素是否被加到了dom树里,但并不代表该元素一定可见 WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw'))) #判断某个元素是否可见,并传入定位元组locator,且宽和高都大于0 WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su'))) #判断元素是否可见,跟visibility_of_element_located有点类似,只是这个方法要传定位到的element WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw'))) #判断是否至少有1个元素存在于dom树中,如果存在至少一个就返回列表 WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'.zn'))) #判断某个元素中的text属性是否包含了预期的字符串 WebDriverWait(driver,10).until(EC.text_to_be_present_in_element((By.XPATH,"//*[@id='u1']/a[8]"),u'修改')) #判断某个元素中的value属性是否包含了预期的字符串 WebDriverWait(driver,10).until(EC.text_to_be_present_in_element_value((By.CSS_SELECTOR,'#s'),u'查询')) #判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False WebDriverWait(driver,10).until(EC.frame_to_be_available_and_switch_to_it((By.ID,'kw'))) #判断某个元素在是否存在于dom或不可见,如果可见返回False,不可见返回这个元素 WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.CSS_SELECTOR,'#Wrap'))) #判断某个元素中是否可见并且是enable的,代表可被点击,只有这样才能被clickable WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='ur']/div[1]/a[1]"))).click() #等待某个元素从dom树中移除,注意,这个方法也是返回True或False WebDriverWait(driver,10).until(EC.staleness_of(driver.find_element(By.ID,'u'))) #判断某个元素是否被选中了,一般用在下拉列表 WebDriverWait(driver,10).until(EC.element_to_be_selected(driver.find_element(By.XPATH,"//*[@id='ur']/option[2]"))) #判断某个元素的选中状态是否符合预期,这里是传入的是element WebDriverWait(driver,10).until(EC.element_selection_state_to_be(driver.find_element(By.XPATH,"//*[@id='ur']/option[1]"),True)) #判断某个元素的选中状态是否符合预期,这里传入的是locator WebDriverWait(driver,10).until(EC.element_located_selection_state_to_be((By.XPATH,"//*[@id='ur']/option[1]"),True)) #判断页面上是否存在alert,如果有alert,就切换到alert并返回alert的内容 instance = WebDriverWait(driver,10).until(EC.alert_is_present()) #接受alert的内容 instance.accept() #关闭浏览器 driver.close()
显示等待的好处就是只需要定位的元素加载完成就能够进行下一步操作,无需全部元素全部加载完成。不仅如此,它还拥有很多定位元素的函数支持,所以我还是比较推荐大家使用这种等待方式。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章