#固定休眠时间设置包导入
from time import sleep
#显性等待包导入
from selenium.webdriver.support.wait import WebDriverWait
from case.drivers_set import driver
#1.固定休眠时间等待
sleep(1)
# 2.隐式等待
driver.implicitly_wait(3)
# 3.显式等待
element = WebDriverWait(driver,3).until(lambda x:x.find_element_by_css_selector('#pp'))
element.send_keys('lyq199205091010')
三种等待的工作原理(摘自网络大佬)
因为各种原因(业务逻辑原因,网络原因,服务器响应原因等),需要在代码加入等待的操作!目前python 中UI自动化的等待最常用的有几种,供大家分析参考:
一,万能的time类
导入time类[import time]使用time.sleep() 或者从time 中导入sleep ,[from time import sleep],使用sleep() ,可以在代码的每一个步骤后写入,这个等待方法灵活自由,但是也有一个弊端就是后面写的时间是必须执行完才可以执行后面的代码,比较消耗时间!还有就是不确定因素导致的等待时间不够的话会代码报错!例如代码写的是sleep(5),等待/休眠5秒,但是网络延迟可能要10秒才刷新出要查询的元素或者页面,那样就会因为找不到相关的元素代码报错导致程序中断! 还有就是加入sleep(5)秒,但是程序1秒后就刷新了,剩下的4秒就浪费了!
二,driver.implicitly_wait() 隐性等待 /智能等待
该方法只适用于webdriver 服务,在UI自动化中使用,在接口自动化或者其他python代码中不能使用! 使用方法,driver.implicitly_wait(10) 执行该代码后以下所有的代码都适用!它的执行思路就是每一个元素定位后下一个元素之前如果定位不到会有等待,每(0.5秒)请求一下元素,(估计是每0.5秒刷新一次,这个都不重要!)一直到设定的10秒后如果还没有请求到元素才报错!上限就是自己输入的值!这样大大缩短了等待的时间,而且不像sleep()方法一样写很多次代码!这个在一个对话中只写一次就可以!大大减少了代码量!
三,WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None) 显性等待
先导入包 :from selenium.webdriver.support.wait import WebDriverWait
有些元素需要等一段时间才能显示出来然后进行操作,(常用在一些业务逻辑控制中,如置灰按钮在满足一定条件后才可以点击等,这个条件可能需要一些延时来实现)同样,该等待方法也是只能在webdriver中使用。具体使用方法示例:
之前的打开浏览器,打开网页就忽略 ,首先是先把隐藏的元素自定义一下:
ls = '//*[text()="xxx"]/../a' (多级元素定位,..代表父级)
其次,实例化一个等待对象
ll = WebDriverWait(driver,30,3).until(lambda driver :driver.find_element_by_xpath(ls))
--->lambda是一个匿名函数
最后,元素出现,操作元素 ll.click()