包的引用
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
使用方法
WebDriverWait(driver, 5, 0.5).until(EC.visibility_of_element_located((By.XPATH, "//span[text() = '创建会场']"))).click()
WebDriverWait(driver, timeout, poll_frequency = 0.5, ignored_exceptions = None)
WebDriverWait(driver, 5, 0.5)
因为WebDriverWait是一个带参数构造类,调用时必须要传递参数(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)
driver - (必选参数)是webDriver的实例,浏览器驱动
timeout - (必选参数)是设置等待超时时间,单位:秒;
poll_frequency - (非必选参数)是休眠时间,默认是0.5秒;
ignored_exceptions - (非必选参数)调用期间忽略异常类的可迭代结构
until()、until_not()
WebDriverWait()一般与until()、until_not()配合
这两个方法需要提供方法作为参数,所以可以结合expected_conditions中的方法或我们自己定义的方法/函数(带返回值)作为参数。
until(method, message='') 在规定时间内,每隔一段时间调用一下 method 方法,直到返回值为 True,如果超时抛出带有 message 的 TimeoutException 异常信息
until_not(method, message='') 与 until( ) 方法相反,表示在规定时间内,每隔一段时间调用一下 method 方法,直到返回值为 False,如果超时抛出带有 message 的 TimeoutException 异常信息
expected_conditions介绍
expected_conditions 是 Selenium 的一个模块,其中包含一系列可用于判断的条件。可以用来判断页面的元素是否可见,是否可点击等操作。
在selenium中的两种等待页面加载的方式
第一种是隐式等待,在webdriver里面提供的implicitly_wait()方法,driver.implicitly_wait(30) #单位:秒
第二种是显示等待,是在support/wait中的WebDriverWait类中实现,可以根据需要设置等待时间和每次等待的步长,当前还有种等待方式,是Python自带time模块中的sleep()方法
这里就注重介绍 WebDriverWait与expected_conditions 结合来检查元素是否存在。
先看 WebDriverWait 中给出示例:
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("someId"))
is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).\
until_not(lambda x: x.find_element_by_id("someId").is_displayed())
element = WebDriverWait(driver, 10,0.2).until(lambda x: x.find_element_by_id("someId"))
web_wait = WebDriverWait(driver,10,0.3) #实例化WebDriverWait类
element=web_wait.until(lambda element:element.find_element_by_id("kw")) #通过WebDriverWait类下的until()方法,调用lambda 函数,去获取元素,获取到则返回该元素。如果获取不到返回false则每0.3秒后,再次调用。直到10秒超时后则报异常。
element.send_keys("selenium") #对元素进行操作
title_is()类:检查页面的标题。title是预期的标题,必须是完全匹配,如果标题匹配则返回True,否则返回false。
print WebDriverWait(driver,5,0.5).until(title_is(u"百度一下,你就知道"))
title_contains()类:检查页面的标题。title是预期的标题,只要部分匹配则返回True,否则返回false
print WebDriverWait(driver,5,0.5).until(title_contains(u"百度一下"))
presence_of_element_located()类:期望检查DOM上是否存在元素一页 这并不一定意味着该元素是可见的,找到则返回该元素
link=WebDriverWait(driver,5,0.5).until(presence_of_element_located((By.ID,"kw")))
link.send_keys("selenium")
url_contains()类:期望检查当前URL是否包含部分内容,则返回True,否则返回false
print WebDriverWait(driver,5,0.5).until(url_contains("baidu.com"))
url_to_be()类:期望检查当前网址。url是否完全匹配的,如果url匹配则返回True,否则返回false。
WebDriverWait(driver,5,0.5).until(url_to_be("https://www.baidu.com/"))
visibility_of_element_located()类:期望检查元素是否存在于DOM的DOM上页面和可见。 可见性意味着不仅显示元素
email=WebDriverWait(driver,5,0.5).until(visibility_of_element_located((By.ID,"kw")))
email.send_keys("123@qq.com")
visibility_of()类:期望检查已知存在的元素页面的DOM是可见的。
WebDriverWait(driver,5,0.5).until(visibility_of((By.ID,"email")))
presence_of_all_elements_located()类:期望检查是否存在至少一个元素在网页上。返回WebElements列表
visibility_of_any_elements_located()类:期望检查至少有一个元素是可见的在网页上。返回WebElements列表
visibility_of_all_elements_located()类:期望检查所有元素是否存在于a的DOM上页面和可见。用于查找元素一旦找到并可见,就会返回WebElements列表
text_to_be_present_in_element()类:期望检查给定文本是否存在于指定的元素。
text_to_be_present_in_element_value()类:期望检查元素中是否存在给定文本定位器,文本
invisibility_of_element_located()类:用于检查元素是否不可见的期望出现在DOM上。
invisibility_of_element()类:检查元素是否不可见的期望出现在DOM上。
element_to_be_clickable()类:检查元素的期望是可见的并且已启用你可以点击它
staleness_of()类:等到元素不再附加到DOM。element是要等待的元素。如果元素仍附加到DOM,则返回False,否则返回true。
element_to_be_selected()类:选择检查选择的期望。element是WebElement对象
element_located_to_be_selected()类:选择对元素的期望。locator是(by,path)的元组
alert_is_present()类:检查是否出现alter面板
网络连接超时等待
import time
import traceback
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from login import log_info
from screen_save import error_log_fun
def check_network_disconnect(brower):
log_info(f'{traceback.extract_stack()[-1].filename}: {traceback.extract_stack()[-1].name}: {traceback.extract_stack()[-1].lineno}',"尝试刷新")
for i in range(0, 30):
try:
WebDriverWait(brower, 5, 0.5).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, 'i[title="首页"')), message='')
log_info(f'{traceback.extract_stack()[-1].filename}: {traceback.extract_stack()[-1].name}: {traceback.extract_stack()[-1].lineno}',"刷新成功")
break
except:
error_log_fun(brower)
try:
brower.find_element(By.CSS_SELECTOR, 'div[id="control-buttons"]').click() # 网络断开连接
log_info(f'{traceback.extract_stack()[-1].filename}: {traceback.extract_stack()[-1].name}: {traceback.extract_stack()[-1].lineno}',"网络断开准备重连")
time.sleep(3)
except:
error_log_fun(brower)
brower.refresh()