爱陪小樱桃

导航

 

元素的等待:

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内全局没有找到对应的元素,就会报错

 

posted on 2017-11-20 17:01  cherry小樱桃  阅读(163)  评论(0编辑  收藏  举报