在UI自动化测试中解决由于网络加载慢而导致资源加载不出来的问题的一般解决方案是使用time库里的sleep(),但是在有的情况下,sleep()可能是解决不了,总的来说有以下三种情况:

1、固定等待,也就是使用sleep()方法

2、隐式等待,使用到的方法是implicitly_wait的方法,可以把它理解为设置最长等待时间

3、显示等待,主要值得是程序每隔一段时间执行自定义的程序判断条件,如果判断成立,程序就会继续执行,那么如果判断失败,就会包TimeOutExpection的异常信息。

1)隐式等待的引入示例

 1 from selenium import 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 #隐式等待30s
 8 driver.implicitly_wait(30)
 9 #进入第一个iframe
10 driver.switch_to.frame("login_frame1")
11 t.sleep(3)
12 #进入第二个iframe
13 driver.switch_to.frame("ptlogin_iframe")
14 t.sleep(3)
15 #点击"密码登录按钮"
16 driver.find_element(By.ID,'switcher_plogin').click()
17 t.sleep(2)
18 #定位到QQ号输入框
19 DevText1=driver.find_element(By.XPATH,'//*[@id="uin_tips"]')
20 #以文本形式输出QQ号输入框中的提示语
21 print(DevText1.text)
22 #对输出的文本内容进行断言
23 assert DevText1.text=="支持QQ号/邮箱/手机号登录"

2、使用WebDriverWait类实现等待示例

 1 from selenium import webdriver
 2 from selenium.webdriver.common.by import By
 3 from selenium.webdriver.support.wait import WebDriverWait
 4 from selenium.webdriver.support import expected_conditions as es
 5 import time as t
 6 driver=webdriver.Chrome()
 7 driver.get("https://file.qq.com/")
 8 #隐式等待6秒,指的是网站打开的时间
 9 driver.implicitly_wait(6)
10 #进入第一个iframe
11 driver.switch_to.frame("login_frame1")
12 t.sleep(2)
13 #进入第二个iframe
14 driver.switch_to.frame("ptlogin_iframe")
15 t.sleep(2)
16 #timeout指的是资源加载定位完成的时间
17 #locator的数据类型为元组类型
18 wait=WebDriverWait(driver=driver,timeout=10).until(method=es.element_to_be_clickable((By.ID,"switcher_plogin")))
19 wait.click()
20 t.sleep(2)
21 driver.quit()

3、指定元素的文本位置

 1 from selenium import webdriver
 2 from selenium.webdriver.common.by import By
 3 from selenium.webdriver.support.wait import WebDriverWait
 4 from selenium.webdriver.support import expected_conditions as es
 5 import time as t
 6 driver=webdriver.Chrome()
 7 driver.maximize_window()
 8 driver.get('https://mail.sina.com.cn/')
 9 driver.implicitly_wait(8)
10 #点击登录按钮
11 driver.find_element(By.CLASS_NAME,'loginBtn').click()
12 #定位警告提示
13 devText=WebDriverWait(driver=driver,timeout=10).until(method=es.element_to_be_clickable((By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')))
14 print(devText.text)
15 assert devText.text=="请输入邮箱名"
16 t.sleep(2)
17 driver.quit()

4、判断元素是否可见

 1 from selenium import webdriver
 2 from selenium.webdriver.common.by import By
 3 from selenium.webdriver.support.wait import WebDriverWait
 4 from selenium.webdriver.support import expected_conditions as es
 5 import time as t
 6 driver=webdriver.Chrome()
 7 driver.maximize_window()
 8 #隐式等待10秒,指的是网站打开的时间
 9 driver.implicitly_wait(10)
10 driver.get('http://www.baidu.com')
11 t.sleep(3)
12 #timeout指的是元素资源加载成功的时间
13 aboutBaidu=WebDriverWait(driver=driver,timeout=10).until(method=es.visibility_of_element_located((By.LINK_TEXT,'关于百度')))
14 #判断存在后,点击关于百度
15 aboutBaidu.click()
16 t.sleep(3)
17 driver.quit()