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.close()#关闭当前窗口
 
 
 
 
 

1.强制等待。   不常用

  sleep(秒)

2.隐性等待。 不常用。

  适用条件是查找元素和等待命令的执行完成。

  implicitly_wait(秒)

  如果单位是 30 秒,不会傻等 30 秒,如果你在 30 秒内找到了一个元素,比如第 15 秒找到了,那么后面 15 秒就不再等了,在找到的时候就马上去执行下一步,所以是种智能等待方式。

  只要在这个时间上限之内,这个元素出现了,什么时候出现就什么时候不再等待。如果超过 30 秒还没有出现,就会抛出异常“TimeoutExceiption”,提示等待超时了,元素至今还没有出现。但是它是整个会话周期有效的。

3.必须掌握"显性等待"

  WebDriverWait(driver,等待时长,轮循周期).until()/until_not()

  明确提出到底要等什么,这个就叫做显性,非常明显的条件。

  明确等到某个条件满足后,再去执行下一步。

  第一部分是等待,第二部分是条件。

等待:

由两个东西来完成,第一个是WebDriverWait类,它是个显性等待类,这个类中处理的事有什么呢?

WebDriverWait类初始化的条件:

driver:第一个是会话对象,就是说它要知道在哪个会话基础上去等待什么样的条件完成,知道是在哪个页面。

等待时长:也就是最多等多少秒,例如等 20 秒,20 秒以内,啥时候出现都不成问题。

轮循周期:是多久去看一次,比如轮循周期是 1 秒钟,就是每一秒去看下这个条件是否成立。

如果它每隔多少秒去看了下,最终在你等待的时限之内,还没有找到一样的,会报TimeoutException

条件:

until()

until是直到某某某条件成立,条件写在()里面的。

直到什么条件成立,等到这个条件成立,until_not()就是等到这个条件不成立,直到找不到某个元素为止,直到页面没有哪个元素。

原文地址:https://www.cnblogs.com/littleBees/p/14675963.html