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 数据可视化
Linux CentOS 平台安装 rar unrar 命令
Linux CentOS 平台安装 rar unrar 命令
2068 0
|
5月前
|
机器学习/深度学习 人工智能 监控
别让医保钱“乱花”——用数据分析把医疗保险费用算明白!
别让医保钱“乱花”——用数据分析把医疗保险费用算明白!
230 13
|
10月前
|
数据采集 Web App开发 JavaScript
Python爬虫如何获取JavaScript动态渲染后的网页内容?
Python爬虫如何获取JavaScript动态渲染后的网页内容?
|
机器学习/深度学习 人工智能 自然语言处理
FullStack Bench:字节豆包联合M-A-P社区开源的全新代码评估基准
FullStack Bench是由字节跳动豆包大模型团队与M-A-P社区联合推出的全新代码评估基准,专注于全栈编程和多语言编程能力评估。该基准覆盖超过11种真实编程场景,包含3374个问题,涉及16种编程语言,旨在更有效地衡量大模型在现实世界中的代码开发能力。
559 5
FullStack Bench:字节豆包联合M-A-P社区开源的全新代码评估基准
|
Web App开发 前端开发 JavaScript
JavaScript动态渲染页面爬取——Selenium的使用(一)
JavaScript动态渲染页面爬取——Selenium的使用(一)
620 4
|
机器学习/深度学习 人工智能 TensorFlow
使用Python和TensorFlow实现图像识别
【8月更文挑战第31天】本文将引导你了解如何使用Python和TensorFlow库来实现图像识别。我们将从基本的Python编程开始,逐步深入到TensorFlow的高级功能,最后通过一个简单的代码示例来展示如何训练一个模型来识别图像。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息。
526 53
|
机器学习/深度学习 数据采集 数据可视化
TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤
本文介绍了 TensorFlow,一款由谷歌开发的开源深度学习框架,详细讲解了使用 TensorFlow 构建深度学习模型的步骤,包括数据准备、模型定义、损失函数与优化器选择、模型训练与评估、模型保存与部署,并展示了构建全连接神经网络的具体示例。此外,还探讨了 TensorFlow 的高级特性,如自动微分、模型可视化和分布式训练,以及其在未来的发展前景。
1104 5
|
Shell 网络安全 开发工具
文本三剑客——grep过滤
文本三剑客——grep过滤
|
机器学习/深度学习 搜索推荐 计算机视觉
【阿里云OpenVI-人脸感知理解系列之人脸识别】基于Transformer的人脸识别新框架TransFace ICCV-2023论文深入解读
本文介绍 阿里云开放视觉智能团队 被计算机视觉顶级国际会议ICCV 2023接收的论文 "TransFace: Calibrating Transformer Training for Face Recognition from a Data-Centric Perspective"。TransFace旨在探索ViT在人脸识别任务上表现不佳的原因,并从data-centric的角度去提升ViT在人脸识别任务上的性能。
3474 342

热门文章

最新文章