元素的等待:
1、有时候我们的网页,可能受到网络的影响或者是服务响应的影响,可能会出现加载比较慢的现象,需要等待一会儿才能加载完整,但是我们自动化的脚本,可能无法判断这些情况,可能会报错,有时候并不是我们网页的问题,可能是需要等一会才能打开,这就需要我们的等待操作,才能避免这种不必要的报错;
2、有的同学可能会说用sleep,但是这里不好这个sleep是写死的,有时候可能网页已经打开了,还在那里等待,有的是3秒的时候打开,结果你设置了等待2秒
有时候有些网络的时间是没法估算的,用sleep不能确定具体的,之前我们用sleep,只是为了,让用户更容易明白,看到的现象更明白;
概念:
显示等待:是针对某个元素进行相关的等待判定
比如我们在一段5S的时间段内,定位百度的搜索框,然后只要能够判断出现百度的搜索框,就不在等待,他是针对某一个元素的;
例如:就像我么在约定的时间内,等人一样,等到了这个人,就不在等了,等时间到了还等不到就直接不在等待;
隐式等待:是针对某个元素进行等待,全局元素的等待
他是针对全局的元素进行等待,并不会针对某一个元素等待,比如说脚本执行都某一个步骤,他会根据你当前执行的元素进行等待,他会把当前页面的所有的元素进行等待
a.显示等待用到的模块:
WebDriveWait 显示等待针对元素必用
expected conditions 预期条件类(里面包含的方法可以调用,用于显示等待)
NoSuchElementException 用于隐式等待抛出异常
By用于元素定位
需求:对百度的搜索按钮进行定位:
1 from selenium import webdriver 2 from selenium.webdriver.support.ui import WebDriverWait #注意字母大写 3 from selenium.webdriver.support import expected_conditions as EC #as这里是对这个异常取一个别名 4 from selenium.common.exceptions import NoSuchElementException 5 from selenium.webdriver.common.by import By 6 from time import sleep 10 #检测百度搜索按钮是否存在,存在就是在输入框里面输入Python,然后点击搜索 12 driver=webdriver.Chrome() 13 driver.get("http://www.baidu.com") 14 driver.find_element_by_css_selector("#kw").send_keys("python") 16 #在当前页面5面中内,每个0.5会检测su这个元素,直到su出现了,就会执行click 17 element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,'su123'))) 18 element.click() 20 sleep(3) 21 driver.quit()
如上上边的代码,中搜索按钮的元素随便改一下,搞成wu123,在执行上述的代码:
1 from selenium import webdriver 2 from selenium.webdriver.support.ui import WebDriverWait #注意字母大写 3 from selenium.webdriver.support import expected_conditions as EC #as这里是对这个异常取一个别名 4 from selenium.common.exceptions import NoSuchElementException 5 from selenium.webdriver.common.by import By 6 from time import sleep 7 8 9 10 #检测百度搜索按钮是否存在,存在就是在输入框里面输入Python,然后点击搜索 11 12 driver=webdriver.Chrome() 13 driver.get("http://www.baidu.com") 14 driver.find_element_by_css_selector("#kw").send_keys("python") 15 16 #在当前页面5面中内,每个0.5会检测su这个元素,直到su出现了,就会执行click 17 element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,'su123'))) 18 element.click() 19 20 sleep(3) 21 driver.quit()
执行结果:
会报错,无法发现该元素;
这就是显示等待;
b.隐式等待:是针对某个元素进行等待,全局元素的等待
需求:等待5S,百度的搜索框,里面输入Python,然后点击搜索;
1 from selenium import webdriver 2 from selenium.common.exceptions import NoSuchElementException 3 from time import sleep,ctime 4 5 driver=webdriver.Chrome() 6 driver.get("http://www.baidu.com") 7 sleep(2) 8 #隐式等待5S 9 driver.implicitly_wait(5) 10 #如果查不到当前的元素就抛出一个异常 11 try: 12 #打印当前的时间 13 print(ctime()) 14 driver.find_element_by_css_selector("#kw").send_keys("python") 15 driver.find_element_by_css_selector("#su").click() 16 except NoSuchElementException as msg: 17 print(msg) 18 finally: 19 print(ctime()) 20 sleep(2) 21 driver.quit()
如果5S内全局没有找到对应的元素,就会报错