IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Selenium:元素判断 -> 正文阅读

[开发测试]Selenium:元素判断

判断元素是否存在

1、前面有介绍过使用Python中的sleep()方法来进行等待:等待一定的时间,让元素加载出来后再执行代码
?? ?⑴但是元素加载出来的时间是不固定的,有时长有时短,因此我们等待的时间就不固定了
?? ?⑵最好的办法是:每隔一定的时间后使用Selenium中的一些方法来判断元素是否加载了出来(这个就是后面要介绍的"显式等待")
?? ??? ?①元素加载出来了,就不继续等待了
?? ??? ?②元素未加载出来,就继续等待

2、另外就是在做自动化的时候,有时候会需要判断元素是否存在,iframe是否存在,以及一些弹出框是否存在,以便确定我们的操作是否符合预期
?? ?⑴相当于一种断言方式了

3、selenium提供了一个专门用于元素判断的模块:expected_conditions
?? ?⑴这个模块用的比较多的场景就是和显示等待一起使用,通过显示等待的方法来循环判断是否元素是否出现
?? ?⑵至于显示等待就后面介绍,这里单独介绍元素判断方法

常用方法介绍

1、expected_conditions的方法种类有很多。大部分都是判断元素的,但是也有判断其他的

方法名描述
title_is判断当前页面的title是否完全等于(==)预期字符串,返回布尔值
title_contains?判断当前页面的title是否包含预期字符串,返回布尔值
url_contains?判断当前页面的url是否精确等于预期,返回布尔值
presence_of_element_located?判断某个元素是否被加到了dom树里(元素是否加载出来),并不代表该元素一定可见,返回元素对象
visibility_of_element_located?判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0,返回元素对象
visibility_of跟上面的方法一样,只是上一个方法的参数为定位方法,该方法的参数为定位后的元素(element对象),返回元素对象
presence_of_all_elements_located判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,返回True
text_to_be_present_in_element?判断某个元素中的text是否包含预期的字符串,返回布尔值
text_to_be_present_in_element_value判断某个元素中的value属性是否包含预期的字符串
frame_to_be_available_and_switch_to_it判断该frame是否可以switch进去,如果可以且switch进去的话,返回True,否则返回False
invisibility_of_element_located判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable 判断某个元素中是否可见并且是可以点击,如果是的就返回这个元素,否则返回False
staleness_of等某个元素从dom树中移除
element_to_be_selected判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be?跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入定位方法
alert_is_present?判断页面上是否存在alert
new_window_is_opened?判断窗口是否增加,传入窗口数量
number_of_windows_to_be期望窗口为多少
frame_to_be_available_and_switch_to_it判断是否切换到iframe

注:
1、上面这些方法都会返回一个<class 'selenium.webdriver.support.expected_conditions.*'>对象,这个对象本质是一个方法函数(object)
?? ?⑴不管最后元素是否是预期状态或找没找到元素等,都会先返回这个对象

2、因为这个对象的本质是一个方法函数,因此可通过"返回的对象(浏览器对象)"来获取具体的值(调用函数)
?? ?⑴找到元素:返回具体的element、True、False
?? ?⑵未找到元素:触发异常

title_is

1、作用:判断当前页面的title是否完全等于(==)预期字符串

2、源码:

class title_is(object):
? ? """An expectation for checking the title of a page.
? ? title is the expected title, which must be an exact match
? ? returns True if the title matches, false otherwise."""
? ? def __init__(self, title):
? ? ? ? self.title = title

? ? def __call__(self, driver):
? ? ? ? return self.title == driver.title
"""
1、注释翻译:检查页面的title与期望值是都完全一致,如果完全一致,返回True,否则返回Flase
2、title_is()这个是一个class类型,里面有两个方法
3、__init__是初始化内容,参数是title,必填项
4、__call__是把实例变成一个对象,参数是driver,返回的是self.title == driver.title
"""

例1:

import time
from selenium import webdriver
# 导入所需模块
from selenium.webdriver.support import expected_conditions as EC

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://www.baidu.com/')
#判断首页title是否为"百度一下,你就知道"
result = EC.title_is("百度一下,你就知道")
# title_is()方法直接返回的是一个对象,可通过浏览器对象继续获取具体的值
print(result) ?#可以看到这个对象本质是一个方法
print(type(result))
# 这里相当于是在调用函数:将浏览器对象作为参数传入title_is()方法返回值中获取具体的值
print(result(driver))

"""
<selenium.webdriver.support.expected_conditions.title_is object at 0x000002300CB626A0>
<class 'selenium.webdriver.support.expected_conditions.title_is'>
True
"""

presence_of_element_located?? ??? ??? ??? ??? ??? ?

1、作用:判断某个元素是否被加到了dom树里,并不代表该元素一定可见,返回元素对象
?? ?⑴是否能在HTML文档中找到该元素

2、返回值:不管元素是否被加到了dom树里,该方法都会返回一个对象(本质是一个方法函数)
?? ?⑴若该元素加到了dom树里,可通过返回的对象来获取具体的元素WebElement对象(调用函数)
?? ?⑵若该元素未加到dom树里,通过返回的对象获取WebElement对象时报错

3、源码:

class presence_of_element_located(object):
? ? """ An expectation for checking that an element is present on the DOM
? ? of a page. This does not necessarily mean that the element is visible.
? ? locator - used to find the element
? ? returns the WebElement once it is located
? ? """
? ? def __init__(self, locator):
? ? ? ? self.locator = locator

? ? def __call__(self, driver):
? ? ? ? return _find_element(driver, self.locator)

"""
参数locator:初始化内容,表示待检查元素的定位方式
其他方法若参数是locator,则表示必须传入元素的定位方式,而不是element对象
"""

例2:找到元素时

import time
from selenium import webdriver
# 导入所需模块
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://www.baidu.com/')
#判断输入框是否可见
result = EC.presence_of_element_located((By.ID,"kw")) # 注意这里的写法(两个括号)
# 返回的是一个对象(本质是一个方法函数),需要通过浏览器对象继续获取具体的值
print(result)
print(type(result))
# 调用函数:将浏览器对象作为参数传入presence_of_element_located()方法返回值中获取具体的值WebElement对象
print(result(driver))

"""
<selenium.webdriver.support.expected_conditions.presence_of_element_located object at 0x000001F366428240>
<class 'selenium.webdriver.support.expected_conditions.presence_of_element_located'>
<selenium.webdriver.remote.webelement.WebElement (session="5c3459ca6d724c2fcaa172f63aaabde0", element="aad85da9-1b3a-476e-8f75-d2ac523696f3")>
"""

例2_1:未找到元素时

import time
from selenium import webdriver
# 导入所需模块
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://www.baidu.com/')
#判断输入框是否可见
result = EC.presence_of_element_located((By.ID,"kw1")) # 注意这里的写法(两个括号)
print(result)
print(type(result))
# 未找到元素时presence_of_element_located依旧会返回一个对象,但是在获取元素对象时会报错
print(result(driver))

"""
<selenium.webdriver.support.expected_conditions.presence_of_element_located object at 0x0000019D3D638240>
<class 'selenium.webdriver.support.expected_conditions.presence_of_element_located'>

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="kw1"]"}
"""

visibility_of_element_located

1、作用:判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0

2、源码:

class visibility_of_element_located(object):
? ? """ An expectation for checking that an element is present on the DOM of a
? ? page and visible. Visibility means that the element is not only displayed
? ? but also has a height and width that is greater than 0.
? ? locator - used to find the element
? ? returns the WebElement once it is located and visible
? ? """
? ? def __init__(self, locator):
? ? ? ? self.locator = locator

? ? def __call__(self, driver):
? ? ? ? try:
? ? ? ? ? ? return _element_if_visible(_find_element(driver, self.locator))
? ? ? ? except StaleElementReferenceException:
? ? ? ? ? ? return False

"""
参数locator:初始化内容,表示待检查元素的定位方式
其他方法若参数是locator,则表示必须传入元素的定位方式,而不是element对象
"""

例3:

import time
from selenium import webdriver
# 导入所需模块
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://www.baidu.com/')
#判断输入框是否可见
result = EC.visibility_of_element_located((By.ID,"kw")) # 注意这里的写法(两个括号)
print(result)
print(type(result))

"""
返回的是一个对象
<selenium.webdriver.support.expected_conditions.visibility_of_element_located object at 0x000001B1713515C0>
<class 'selenium.webdriver.support.expected_conditions.visibility_of_element_located'>
"""

visibility_of?? ??? ??? ??? ??? ??? ??? ??? ??? ?

1、作用:跟上面的方法一样,只是上一个方法的参数为定位方法,该方法的参数为定位后的元素(element对象)

2、源码:

class visibility_of(object):
? ? """ An expectation for checking that an element, known to be present on the
? ? DOM of a page, is visible. Visibility means that the element is not only
? ? displayed but also has a height and width that is greater than 0.
? ? element is the WebElement
? ? returns the (same) WebElement once it is visible
? ? """
? ? def __init__(self, element):
? ? ? ? self.element = element

? ? def __call__(self, ignored):
? ? ? ? return _element_if_visible(self.element)

"""
参数element:初始化内容,表示待检查元素的element对象
其他方法若参数是element,则表示必须传入元素的element对象
"""

例4:

import time
from selenium import webdriver
# 导入所需模块
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://www.baidu.com/')
#判断输入框是否可见
element = driver.find_element_by_id("kw")
result = EC.visibility_of(element)
print(result)
print(type(result))

"""
<selenium.webdriver.support.expected_conditions.visibility_of object at 0x000001F923994D30>
<class 'selenium.webdriver.support.expected_conditions.visibility_of'>

"""

text_to_be_present_in_element?? ??? ??? ??? ??? ?

1、作用:判断某个元素中的text是否包含预期的字符串

2、txt:表示标签对之间的数据
?

例5:

import time
from selenium import webdriver
# 导入所需模块
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://www.baidu.com/')
#判断输入框是否可见
result = EC.text_to_be_present_in_element((By.ID,"s-top-loginbtn"),"登录") # 注意这里的写法(两个括号)
print(result)
print(type(result))
print(result(driver))
"""
<selenium.webdriver.support.expected_conditions.text_to_be_present_in_element object at 0x000001D397A93668>
<class 'selenium.webdriver.support.expected_conditions.text_to_be_present_in_element'>
True
"""

text_to_be_present_in_element_value?? ??? ??? ??? ?

1、作用:判断某个元素中的value属性是否包含预期的字符串

2、该方法用于判断标签value属性的值(只针对于value属性)
?

例5:

import time
from selenium import webdriver
# 导入所需模块
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

# 获取浏览器对象
driver = webdriver.Chrome()
# 设置浏览器窗口大小
driver.maximize_window()
# 进入页面
driver.get('https://www.baidu.com/')
#判断输入框是否可见
# result = EC.text_to_be_present_in_element_value((By.ID,"su"),"百度一下") # 注意这里的写法(两个括号)
# print(result)
# print(type(result))
# print(result(driver))
# 或
result = EC.text_to_be_present_in_element_value((By.ID,"su"),"百度一下")(driver)
print(result)

"""
<selenium.webdriver.support.expected_conditions.text_to_be_present_in_element_value object at 0x000001D1AE911630>
<class 'selenium.webdriver.support.expected_conditions.text_to_be_present_in_element_value'>
True
"""


?

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:22:01  更:2022-03-21 21:23:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:21:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码