问题:在写web自动化时,为什么需要加上等待时间呢?
答:做web自动化实际上就是定位页面上的元素,然后对它进行操作。当电脑系统卡或者网络延迟等外在因素影响时,页面还没有出现定位的元素,代码就运行下一个步骤,导致没有定位到该元素,代码就报错。加上等待时间,就可以解决这个问题。
1、强制等待:time.sleep()
这个方法简单粗暴,意思是:无论发生什么事,都会在10s后再去执行后续的代码,在编写脚本时,不建议经常性的使用,会减低代码的运行速度,影响整体效率。
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.csdn.net/')
driver.find_element_by_xpath("//a[text()='登录/注册']").click()
driver.find_element_by_xpath("//a[text()='账号登录']").click()
ele = driver.find_element_by_xpath("//input[@id='all']")
time.sleep(3) #强制等待3s,再执行输入的代码
ele.send_keys('88888888')
2、隐形等待:implicitly_wait()
设置一个最长等待时间,如果在规定时间内网页全部元素加载完成,则执行下一步,否则一直等待时间截止才执行下一步。这个方法比sleep智能,能够自主判断。
隐性等待对整个driver的周期都起作用,所以只要设置一次即可,全局都可使用
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.csdn.net/')
driver.find_element_by_xpath("//a[text()='登录/注册']").click()
driver.find_element_by_xpath("//a[text()='账号登录']").click()
ele = driver.find_element_by_xpath("//input[@id='all']")
driver.implicitly_wait(30) #隐性等待,最长等待时间30s
ele.send_keys('88888888')
从上面源码截图看出,隐性等待注释:等待一个元素被发现(假如:1、元素被发现了,但是不能点击;2、元素被发现了,但是暂时不能用;这种场景怎么办呢?–接下来就可以用:显性等待)
3、显示等待
显性等待的作用是:程序每隔n秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException
需要用到WebDriverWait类和expected_conditions模块,具体使用步骤如下:
①使用之前,导入相关的库
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
②确定元素的定位表达式
login_xpath = “//input[@id=‘all’]”
③使用expected_conditions 对应的方法来生成判断条件
EC.方式名(定位方式,定位表达式)
例:EC.visibility_of_element_located((By.XPATH, login_xpath)) #判断某个元素是否可见
expected_conditions模块中还有很多其他的条件类,如需要,请自行百度!!!
④调用WebDriverWait类设置等待总时长、轮询的时间
WebDriverWait.(webdriver对象名,等待总时长,轮询周期).until(判断条件)
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://www.csdn.net/')
driver.find_element_by_xpath("//a[text()='登录/注册']").click()
driver.find_element_by_xpath("//a[text()='账号登录']").click()
login_xpath = "//input[@id='all']"
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((By.XPATH, login_xpath))) #这里有个坑,3层元组
driver.find_element_by_xpath(login_xpath).send_keys('123456789')