python-web自动化-三种等待方式
当有元素定位不到时,比如下拉框,弹出框等各种定位不到时;
一般是两种问题:1 、有frame ;2、没有加等待
下面学习三种等待方式:
1.强制等待 sleep(xx)
这种方法简单粗暴,不管浏览器是否加载完,程序都要等待规定的xx时间,时间到了才继续执行下面的代码。
不建议总是用这种等待方式,会严重影响程序的执行速度。
1
2
3
4
5
6
7
8
|
# -*- coding:utf-8 -*-
from
selenium
import
webdriver
from
time
import
sleep
driver
=
webdriver.Chrome()
driver.get(
'https://www.baidu.com/'
)
sleep(
3
)
#强制性等待3s再执行以下代码
print
(driver.current_url)
driver.quit()
#退出驱动,关闭所有窗口
|
2.隐性等待 implicitly_wait(xx)
这种方法是设置一个最长的等待时间,如果在规定时间内网页全部元素加载完成,则执行下一步,否则一直等待时间截止才执行下一步。比强制性等待智能些
!隐性等待对整个driver的周期都起作用,所以只要设置一次即可
1
2
3
4
5
6
7
|
# -*- coding:utf-8 -*-
from
selenium
import
webdriver
driver
=
webdriver.Chrome()
driver.get(
'https://www.baidu.com/'
)
driver.implicitly_wait(
30
)
#隐性等待,最长30s
print
(driver.current_url)
driver.quit()
|
3.显性等待 WebDriverWait
WebDriverWait配合该类的until()和until_not()方法,根据条件灵活的等待
程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
A. 使用前,先引用相关库
B. 确定元素的定位表达式
C. 使用expected_conditions对应的方法来生成判断条件
WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.ID,ele_locator)))
WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.XPATH,ele_locator)))
D. 调用WebDriverWait类设置等待总时长、轮询周期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# -*- coding:utf-8 -*-
#A. 使用前,先引用相关库
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()
#打开Chrome浏览器
driver.get(
'https://www.baidu.com/'
)
#打开百度
driver.find_element_by_xpath(
'//div[@id="u1"]//a[@name="tj_login"]'
).click()
#点击【登录】;click() 方法,可模拟在按钮上的一次鼠标单击。
# B. 确定元素的定位表达式
ele_locator
=
"TANGRAM__PSP_10__footerULoginBtn"
#通过id,确定‘用户名登录’元素
# C. 使用expected_conditions对应的方法来生成判断条件
# EC.方法名(定位方式,定位表达式)
# EC.visibility_of_element_located(By.ID,ele_locator)#元素可见
# D. 调用WebDriverWait类设置等待总时长、轮询周期
# WebDriverWait(driver, 超时时长, 调用频率(默认0.5s)).until(可执行方法, 超时时返回的信息)
# 等待10秒钟,每隔1秒去查看对应的元素是否可见;如果可见,继续下一步操作;如果不可见,则继续等待,直到10s结束,如果元素还是不可见,则抛出超时异常
WebDriverWait(driver,
10
,
1
).until(EC.visibility_of_element_located((By.
ID
,ele_locator)))
|
1
2
3
|
driver.find_element_by_id(
'TANGRAM__PSP_10__footerULoginBtn'
).click()
#点击【用户名登录】
driver.quit()
#退出会话
#driver.close()
#关闭窗口
|
当有元素定位不到时,比如下拉框,弹出框等各种定位不到时;
一般是两种问题:1 、有frame ;2、没有加等待
下面学习三种等待方式:
1.强制等待 sleep(xx)
这种方法简单粗暴,不管浏览器是否加载完,程序都要等待规定的xx时间,时间到了才继续执行下面的代码。
不建议总是用这种等待方式,会严重影响程序的执行速度。
1
2
3
4
5
6
7
8
|
# -*- coding:utf-8 -*-
from
selenium
import
webdriver
from
time
import
sleep
driver
=
webdriver.Chrome()
driver.get(
'https://www.baidu.com/'
)
sleep(
3
)
#强制性等待3s再执行以下代码
print
(driver.current_url)
driver.quit()
#退出驱动,关闭所有窗口
|
2.隐性等待 implicitly_wait(xx)
这种方法是设置一个最长的等待时间,如果在规定时间内网页全部元素加载完成,则执行下一步,否则一直等待时间截止才执行下一步。比强制性等待智能些
!隐性等待对整个driver的周期都起作用,所以只要设置一次即可
1
2
3
4
5
6
7
|
# -*- coding:utf-8 -*-
from
selenium
import
webdriver
driver
=
webdriver.Chrome()
driver.get(
'https://www.baidu.com/'
)
driver.implicitly_wait(
30
)
#隐性等待,最长30s
print
(driver.current_url)
driver.quit()
|
3.显性等待 WebDriverWait
WebDriverWait配合该类的until()和until_not()方法,根据条件灵活的等待
程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
A. 使用前,先引用相关库
B. 确定元素的定位表达式
C. 使用expected_conditions对应的方法来生成判断条件
WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.ID,ele_locator)))
WebDriverWait(driver,10,1).until(EC.visibility_of_element_located((By.XPATH,ele_locator)))
D. 调用WebDriverWait类设置等待总时长、轮询周期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# -*- coding:utf-8 -*-
#A. 使用前,先引用相关库
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()
#打开Chrome浏览器
driver.get(
'https://www.baidu.com/'
)
#打开百度
driver.find_element_by_xpath(
'//div[@id="u1"]//a[@name="tj_login"]'
).click()
#点击【登录】;click() 方法,可模拟在按钮上的一次鼠标单击。
# B. 确定元素的定位表达式
ele_locator
=
"TANGRAM__PSP_10__footerULoginBtn"
#通过id,确定‘用户名登录’元素
# C. 使用expected_conditions对应的方法来生成判断条件
# EC.方法名(定位方式,定位表达式)
# EC.visibility_of_element_located(By.ID,ele_locator)#元素可见
# D. 调用WebDriverWait类设置等待总时长、轮询周期
# WebDriverWait(driver, 超时时长, 调用频率(默认0.5s)).until(可执行方法, 超时时返回的信息)
# 等待10秒钟,每隔1秒去查看对应的元素是否可见;如果可见,继续下一步操作;如果不可见,则继续等待,直到10s结束,如果元素还是不可见,则抛出超时异常
WebDriverWait(driver,
10
,
1
).until(EC.visibility_of_element_located((By.
ID
,ele_locator)))
|
1
2
3
|
driver.find_element_by_id(
'TANGRAM__PSP_10__footerULoginBtn'
).click()
#点击【用户名登录】
driver.quit()
#退出会话
#driver.close()
#关闭窗口
|