Selenium--WebDriverWait--你知道显示等待?(中-详解篇)

简介: Selenium--WebDriverWait--你知道显示等待?(中-详解篇)

前言

这里是清安,上一章讲了显示等待的理论以及部分用法,本章我们讲一讲Expected_conditions通常也叫EC模块。

注意:不论3.0的还是4.0的,都有这个模块。本章所用的是4.2的。

本章主要以封装的形式进行讲解。上车了!

倒包

from selenium.webdriver.support import expected_conditions as EC

title_is

检查页面标题的期望。title是预期的标题,必须完全匹配如果标题匹配,则返回True,否则返回false。

# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
class Brouser:
    fox = webdriver.Firefox()
    wait = WebDriverWait(fox, 5)
    def get_url(self,url):
        self.fox.get(url)
    def title(self,value):
        self.wait.until(EC.title_is(value),message='标题不匹配哦')
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.title('用户登录 - iWebShop商城演示')

「对以上代码做一个解析,后续都是沿用如上代码」

此处的写法可能跟你们在网上看到的不一样,不过问题不大,怎么写看自己来。主要是方法的书写这里直接将驱动、显示等待写成了类中的属性,定义了一个url方法,用于打开浏览器地址的。

title_is判断浏览器标题的,如果标题不对,则会输出message的提示信息,例如:

selenium.common.exceptions.TimeoutException: Message: 标题不匹配哦

最后又一个执行入口,在里面实例化了类以及调用类中的各种方法。需要传值就传值,不需要的直接调用

title_contains

检查标题是否包含区分大小写的子字符串。title是所需的标题片段当标题匹配时返回True,否则返回False

# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
class Brouser:
    fox = webdriver.Firefox()
    wait = WebDriverWait(fox, 5)
    def get_url(self,url):
        self.fox.get(url)
    def contains_title(self,value):
        self.wait.until(EC.title_contains(value))
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.contains_title('用户登录 - iWebShop商城演示')
    b.contains_title('iWebShop商城演示')

这一项,用的不多,也可以用来判断是否包含指定、特定的文本,如上所示。

presence_of_element_located

检查DOM上是否存在元素的期望一页的。这并不一定意味着元素是可见的。定位器-用于查找元素找到WebElement后返回该WebElement

# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
class Brouser:
    fox = webdriver.Firefox()
    wait = WebDriverWait(fox, 5)
    def get_url(self,url):
        self.fox.get(url)
    def presence_located(self,value,*ele):
        el = self.wait.until(EC.presence_of_element_located(ele),message='没有发现期望的元素')
        el.send_keys(value)
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.presence_located('qingan',By.NAME,'login_info')

「上述所说定位器-用于查找元素找到WebElement后返回该WebElement,所以我们在presence_of_element_located(ele)传入这个元素之后,并经过显示等待判断知道了元素存在这个界面上,那就返回这个元素,我们就可以直接拿着这个值进行下一步操作,例如上述的输入操作。」

此外,上述也说了这并不一定意味着元素是可见的,意味着不可见元素也能检测出来,但是你无法做其他操作。

visibility_of_element_located

检查元素是否存在于页面和可见。可见性意味着不仅显示元素但其高度和宽度也大于0。定位器-用于查找元素找到并可见WebElement后返回该WebElement

# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
class Brouser:
    fox = webdriver.Firefox()
    wait = WebDriverWait(fox, 5)
    def get_url(self,url):
        self.fox.get(url)
    def visibility_located(self,value,*ele):
        el = self.wait.until(EC.visibility_of_all_elements_located(ele), message='没有发现期望的元素')
        el[0].send_keys(value)
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.visibility_located('qingan',By.NAME,'password')

此处值得说的是el[0],为什么是el[0],因为此处这样的写法返回后是个list列表,所以需要通过取值的方式将元素取出来。

url_to_be

检查当前url的期望值。url是预期的url,必须完全匹配。如果url匹配,则返回True,否则返回false

# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
class Brouser:
    fox = webdriver.Firefox()
    wait = WebDriverWait(fox, 5)
    def get_url(self,url):
        self.fox.get(url)
    def url_be(self,url):
        self.wait.until(EC.url_to_be(url))
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.url_be('http://shop.aircheng.com/simple/login')

判断url还有另外的几种方式,都大同小异,可以了解一下。

「url_matches」  :    检查当前url的期望值。pattern是预期的模式,必须是完全匹配的如果url匹配,则返回True,否则返回false。「url_contains」 : 检查当前url是否包含区分大小写的子字符串。url是所需url的片段,url匹配时返回True,否则返回False

「url_changes」  : 检查当前url的期望值。url是预期的url,不能完全匹配如果url不同,则返回True,否则返回false。

visibility_of

检查已知存在于页面的DOM是可见的。可见性意味着元素不仅仅是显示,但高度和宽度也大于0。元素是WebElement在WebElement可见时返回(相同的)WebElement

# ----清安—---
# 微信:qing_an_an
# 公众号:测个der
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
class Brouser:
    fox = webdriver.Firefox()
    wait = WebDriverWait(fox, 5)
    def get_url(self,url):
        self.fox.get(url)
    def visibility_(self,*ele):
        el = self.wait.until(EC.visibility_of(self.fox.find_element(*ele)))
        el.click()
if __name__ == '__main__':
    b = Brouser()
    b.get_url('http://shop.aircheng.com/simple/login')
    b.visibility_(By.NAME, 'remember')

这里值得注意的是,visibility_of_element_located跟visibility_of很类似。与上面的写法不同EC.visibility_of里面我写的是定位,而非单纯的元素。这也是一个区别点。在后续的使用中注意一下。

最后!说一下,上文中明明提起了True跟Flase但是没有看文中提起。

一、可以给定一个变量例如上文中的el,直接print(el)即可看到

二、是因为为True直接可以向下操作其他步骤了,没必要非要看到True。如果是False就会告诉你错误了。

下一章介绍其他的显示等待。

目录
相关文章
|
存储 Kubernetes 数据可视化
|
机器学习/深度学习 人工智能 TensorFlow
使用Python和TensorFlow实现图像识别
【8月更文挑战第31天】本文将引导你了解如何使用Python和TensorFlow库来实现图像识别。我们将从基本的Python编程开始,逐步深入到TensorFlow的高级功能,最后通过一个简单的代码示例来展示如何训练一个模型来识别图像。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息。
371 53
|
Python
ValueError: sleep length must be non-negative
ValueError: sleep length must be non-negative
349 3
|
机器学习/深度学习 测试技术 TensorFlow
【大作业-01】花卉识别-基于tensorflow2.3实现
2021年6月18日更新:提供修复后的TensorFlow 2.3物体分类代码,支持自定义数据集训练。包含CSDN教程、B站视频、数据集及代码下载链接。示例项目为花卉识别,涵盖模型训练、测试、保存和使用,附带图形界面操作指南。
213 0
【大作业-01】花卉识别-基于tensorflow2.3实现
|
供应链 安全 大数据
区块链与大数据:重构未来世界的密码
在科技飞速发展的时代,大数据被誉为“未来的石油”,区块链则被称为“信任的机器”。两者结合,将如何重塑世界?本文解析区块链与大数据的核心特性——区块链的去中心化、安全透明与大数据的海量、多样、实时价值;展示其在金融、供应链、医疗、交通等领域的应用场景;并展望未来跨界融合、信任重构、智能化发展以及隐私保护的趋势,预示着一个高效可信的新时代的到来。
877 1
|
Java 关系型数据库 MySQL
JavaWeb基础第一章(MySQL数据库与JDBC)
JavaWeb基础第一章(MySQL数据库与JDBC)
|
数据采集 数据中心
适合爬虫开发用的性价比高的代理推荐
在爬虫开发中,代理用于隐藏真实IP并规避限制。考虑性价比,共享代理适合初学者或低预算项目,虽稳定性稍弱;独享代理提供更高性能和稳定性,适合复杂任务;住宅代理因其真实IP特性,适合高隐蔽性需求,但价格较高;数据中心代理速度快但易被识别,需谨慎使用。选择时要结合任务需求、服务质量和提供商信誉,确保满足爬虫需求。
|
机器学习/深度学习 搜索推荐 计算机视觉
【阿里云OpenVI-人脸感知理解系列之人脸识别】基于Transformer的人脸识别新框架TransFace ICCV-2023论文深入解读
本文介绍 阿里云开放视觉智能团队 被计算机视觉顶级国际会议ICCV 2023接收的论文 "TransFace: Calibrating Transformer Training for Face Recognition from a Data-Centric Perspective"。TransFace旨在探索ViT在人脸识别任务上表现不佳的原因,并从data-centric的角度去提升ViT在人脸识别任务上的性能。
3058 341
|
机器学习/深度学习 前端开发 API
Gradio.NET:一个快速制作演示demo网页的利器
Gradio.NET:一个快速制作演示demo网页的利器
305 0
|
存储 SQL 数据库
解决sqlite删除数据后,文件大小不变问题(VACUUM)
解决sqlite删除数据后,文件大小不变问题(VACUUM)
1377 0