UI自动化测试-WebDriverWait类的方法
WebDriverWait类的方法
1、为什么要引用WebDriverWait类?
在UI自动化测试中,经常会出现由于网络加载慢等问题而使资源加载不出来,从而使测试效率大大折扣。因此我们要引用WebDriverWait类。
2、在UI自动化测试中,关于等待有三点:
a、固定等待,也就是使用sleep()方法
b、隐式等待,使用到的方法是implicitly_wait的方法,可以把它理解为设置最长等待时间
c、显式等待,主要指的是程序每隔一段时间执行自定义的程序判断条件,如果判断成立,程序就会继续执行,那么如果判断失败,就会报TimeOutExpection的异常信息。
3、使用WebDriverWait类,我们需要导入它,导入的命令为:
from selenium.webdriver.support.ui import WebDriverWait
4、等待实战
4-1:固定等待+隐式等待:使用sleep()方法和implicitly_wait()方法--以腾讯文件为例
1 from selenium import webdriver #包:selenium,模块:webdriver 2 from selenium.webdriver.common.by import By 3 import time as t 4 driver=webdriver.Chrome() 5 driver.maximize_window() 6 driver.get("https://file.qq.com/") 7 driver.implicitly_wait(20) 8 #进入第一个iframe 9 driver.switch_to.frame('login_frame1') 10 t.sleep(3)#进入第二个iframe 11 driver.switch_to.frame('ptlogin_iframe') 12 t.sleep(3) 13 #点击密码登录 14 driver.find_element(By.ID,'switcher_plogin').click() 15 t.sleep(3) 16 #"支持QQ号/邮箱/手机号登录"框的断言验证 17 divText1=driver.find_element(By.ID,'uin_tips') 18 assert divText1.text=="支持QQ号/邮箱/手机号登录" 19 print(divText1.text) 20 t.sleep(2) 21 #"请输入密码"框的断言验证 22 divText2=driver.find_element(By.ID,'pwd_tips') 23 assert divText2.text=="请输入密码" 24 print(divText2.text) 25 t.sleep(2) 26 driver.quit()
之所以两个iframe框架原因:
4-2:显式等待--以腾讯文件为例
在显示等待里我们需要用到WebDriverWait()方法和until()方法:
我们使用WebDriverWait()方法,这个方法的导入在前文开头以书写
而until()方法:
def until(self, method, message=''): """Calls the method provided with the driver as an argument until the \ return value does not evaluate to ``False``. :param method: callable(WebDriver) :param message: optional message for :exc:`TimeoutException`
该方法的形式参数中,method是方法,其实这个方法要导入的代码是:
from selenium.webdriver.support import expected_conditions as es
代码如下:
1 from selenium import webdriver #包:selenium,模块:webdriver 2 from selenium.webdriver.common.by import By 3 import time as t 4 from selenium.webdriver.support.ui import WebDriverWait 5 from selenium.webdriver.support import expected_conditions as es 6 driver=webdriver.Chrome() 7 driver.maximize_window() 8 driver.get("https://file.qq.com/") 9 driver.implicitly_wait(20) #网络运行速度 10 # 进入第一个iframe 11 driver.switch_to.frame('login_frame1') 12 t.sleep(3) 13 # 进入第二个iframe 14 driver.switch_to.frame('ptlogin_iframe') 15 t.sleep(3) 16 17 wait=WebDriverWait(driver=driver, 18 timeout=12).until( 19 method=es.element_to_be_clickable(( 20 By.ID,'switcher_plogin'))) #timeout=12是资源等待时间 21 # 使用时注意事项:es.element_to_be_clickable((By.ID,'switcher_plogin')),这个方法要有两个括号,因为参数只能是一个元组。 22 t.sleep(3) 23 driver.quit()
4-3:综合实战--以新浪邮箱为例
1 from selenium import webdriver #包:selenium,模块:webdriver 2 from selenium.webdriver.common.by import By 3 import time as t 4 from selenium.webdriver.support.ui import WebDriverWait 5 from selenium.webdriver.support import expected_conditions as es 6 driver=webdriver.Chrome() 7 driver.maximize_window() 8 driver.get("https://mail.sina.com.cn/") 9 driver.implicitly_wait(12) 10 driver.find_element(By.LINK_TEXT,"登录").click() 11 divText=WebDriverWait( 12 driver=driver, 13 timeout=12).until( 14 method=es.element_to_be_clickable(( 15 By.CSS_SELECTOR,'body > div.mailLoginBox > div > div.mainBox.bg1 > div > div > div:nth-child(6) > div.loginBox > div.freeMailbox > div.freeError > span.loginError.tip11'))) 16 assert divText.text=='请输入邮箱名' 17 print(divText.text) 18 driver.quit()
5、判断元素是否可见--以百度主页面的”关于百度“为例
from selenium import webdriver #包:selenium,模块:webdriver from selenium.webdriver.common.by import By import time as t from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as es driver=webdriver.Chrome() driver.maximize_window() driver.get("https://www.baidu.cn/") driver.implicitly_wait(20) about=WebDriverWait( driver=driver, timeout=12).until( method=es.visibility_of_element_located(( By.LINK_TEXT,'关于百度'))) #精确查找 about.click() t.sleep(3) driver.quit()