如何在Selenium WebDriver中处理Web表?
在需要以表格格式显示信息的情况下,通常使用Web表或数据表。本质上,显示的数据可以是静态的也可以是动态的。您经常会在电子商务门户网站中看到这样的示例,其中产品规格显示在Web表中。随着它的广泛使用,您经常会遇到需要在Selenium测试自动化脚本中处理它们的场景。
在本Selenium WebDriver教程中,我将看一下如何在Selenium中处理Web表以及可以在Web表上执行的一些有用操作。在本教程结束时,您将全面了解Selenium测试自动化中的Web表以及用于访问Web表内容的方法。
Selenium中的Web表是什么?
Selenium中的Web表格是WebElement,就像其他任何流行的WebElement一样,例如文本框,单选按钮,复选框,下拉菜单等。Web表格及其内容可以通过使用WebElement函数以及定位器来标识元素(行/列)。
表格由行和列组成。为网页创建的表称为网页表。以下是与网络表格相关的一些重要标记:
<table> –定义一个HTML表
<th> –在表中包含标题信息
<tr> –定义表中的一行
<td> –定义表中的列
Selenium中Web表的类型
表格分为两大类:
静态网页表
顾名思义,表中的信息本质上是静态的。
动态网页表
表中显示的信息是动态的。例如,电子商务网站上的详细产品信息,销售报告等。
为了演示如何使用Selenium处理表格,我们使用w3school HTML表格页面中可用的表格。尽管使用表时跨浏览器测试的问题较少,但是Internet Explorer,Chrome和其他Web浏览器的某些旧版浏览器不支持HTML Table API。
既然我们已经介绍了基础知识,接下来在本Selenium WebDriver教程中,我将介绍一些处理Selenium中表的常用操作,这些操作将有助于您进行Selenium测试自动化工作。
在Selenium中处理Web表
我将使用本地Selenium WebDriver来执行浏览器操作,以处理Selenium中的表,该表存在于w3schools html表页面上。tryit适配器页面中提供了用于演示的Web表的HTML代码。
可以从下面提到的位置下载适用于流行浏览器的Selenium WebDriver:
| |
---|---|
| |
| |
| |
| |
| |
我将使用Python unittest框架来处理Selenium WebDriver中的表。即使您将其他编程语言用于Selenium测试自动化,访问Web表中元素的核心逻辑也保持不变。
注–在所有方案中,setUp()和teardown()中的实现均相同。我们不会在博客中显示的每个示例中都重复该部分。
处理Web表中的行数和列数
< tr >
表中的标签指示表中的行,该标签用于获取有关表中行数的信息。使用XPath(// * [@ id ='customers'] / tbody / tr [2] / td)计算Selenium中Web表的列数。使用浏览器中的检查工具获取行和列的XPath,以处理Selenium中的表以进行自动浏览器测试。
尽管网络表中的标头不是< td >
,但< th >
在当前示例中仍可以使用标记来计算列数。使用< th >
标记计算列数的XPath 是// * [@@ id ='customers'] / tbody / tr / th
添加了30秒的WebDriverWait,以确保在执行任何处理Selenium中的表的操作之前完成Web表的加载(CLASS_NAME = w3-example)。
获取Selenium中Web表的行数
num_rows = len (driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr"))
获取Selenium中Web表的列数
num_cols = len (driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr[2]/td"))
完成实施
import unittest
import time
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
test_url = "https://www.w3schools.com/html/html_tables.asp"
class WebTableTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
def test_1_get_num_rows_(self):
driver = self.driver
driver.get(test_url)
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CLASS_NAME, "w3-example")))
num_rows = len (driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr"))
print("表中的行是 " + repr(num_rows))
def test_2_get_num_cols_(self):
driver = self.driver
driver.get(test_url)
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CLASS_NAME, "w3-example")))
# num_cols = len (driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr/th"))
num_cols = len (driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr[2]/td"))
print("表中的列是 " + repr(num_cols))
def tearDown(self):
self.driver.close()
self.driver.quit()
if __name__ == "__main__":
unittest.main()
下面是输出快照
用Selenium打印Web表的内容
为了访问Selenium中每一行和每一列中存在的内容来处理Selenium中的表,我们迭代< tr >
了Web表中的每一行()。获得有关行的详细信息后,我们将迭代该< td >
行下的标签。
在这种情况下,对于本Selenium WebDriver教程,行(< tr >
)和列(< td >
)都是可变的。因此,行号和列号是动态计算的。下面显示的是用于访问特定行和列中的信息的XPath:
XPath访问行: 2,列:2 – // * [@@ ==“ customers”] / tbody / tr [2] / td [1]
XPath访问行: 3,列:1 – // * [@ id =“ customers”] / tbody / tr [3] / td [1]
执行Selenium测试自动化的表具有7行3列。因此,执行嵌套的for循环时,行的范围为2..7,列的范围为1..4。添加变量因子,即行号和列号,以制定最终的XPath。
for t_row in range(2, (rows + 1)):
for t_column in range(1, (columns + 1)):
FinalXPath = before_XPath + str(t_row) + aftertd_XPath + str(t_column) + aftertr_XPath
cell_text = driver.find_element_by_xpath(FinalXPath).text
本Selenium WebDriver教程下面显示的是将所有存在的内容处理到Selenium中的表的完整实现。
import unittest
import time
test_url = "https://www.w3schools.com/html/html_tables.asp"
before_XPath = "//*[@id='customers']/tbody/tr["
aftertd_XPath = "]/td["
aftertr_XPath = "]"
def test_get_row_col_info_(self):
driver = self.driver
driver.get(test_url)
# time.sleep(30)
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CLASS_NAME, "w3-example")))
rows = len(driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr"))
# print (rows)
columns = len(driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr[2]/td"))
# print(columns)
# print("Company"+" "+"Contact"+" "+"Country")
for t_row in range(2, (rows + 1)):
for t_column in range(1, (columns + 1)):
FinalXPath = before_XPath + str(t_row) + aftertd_XPath + str(t_column) + aftertr_XPath
cell_text = driver.find_element_by_xpath(FinalXPath).text
# print(cell_text, end = ' ')
print(cell_text)
print()
下面是打印内容以处理Selenium中的表的输出快照:
读取行中的数据以处理Selenium 中的表
为了访问每一行中的内容,以处理Selenium中的表,行(< tr >
)是可变的,而列(< td >
)将保持不变。因此,行是动态计算的。在本Selenium WebDriver教程的下面,是用于访问信息的XPath,其中行是变量因子,而列对于Selenium测试自动化而言保持不变。
XPath访问行: 1,列:1 – // * [@ id =” customers”] / tbody / tr [1] / td [1]
XPath访问行: 2,列:2 – // * [@@ ==“ customers”] / tbody / tr [2] / td [2]
XPath访问行: 3,列:2 – // * [@ id =“ customers”] / tbody / tr [3] / td [2]
for循环的执行范围为2..7。列值附加到XPath的值为td [1] / td [2] / td [3],具体取决于必须访问以处理Selenium中的表的行和列。
before_XPath = "//*[@id='customers']/tbody/tr["
aftertd_XPath_1 = "]/td[1]"
aftertd_XPath_2 = "]/td[2]"
aftertd_XPath_3 = "]/td[3]"
for t_row in range(2, (rows + 1)):
FinalXPath = before_XPath + str(t_row) + aftertd_XPath_1
cell_text = driver.find_element_by_xpath(FinalXPath).text
print(cell_text)
完成实施
#Selenium Webdriver教程可在Selenium中处理以实现Selenium测试自动化
import unittest
import time
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
test_url = "https://www.w3schools.com/html/html_tables.asp"
before_XPath = "//*[@id='customers']/tbody/tr["
aftertd_XPath_1 = "]/td[1]"
aftertd_XPath_2 = "]/td[2]"
aftertd_XPath_3 = "]/td[3]"
#aftertr_XPath = "]"
def test_get_row_col_info_(self):
driver = self.driver
driver.get(test_url)
# time.sleep(30)
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CLASS_NAME, "w3-example")))
rows = len(driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr"))
# print (rows)
columns = len(driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr[2]/td"))
# print(columns)
print("行中的数据,列1")
print()
for t_row in range(2, (rows + 1)):
FinalXPath = before_XPath + str(t_row) + aftertd_XPath_1
cell_text = driver.find_element_by_xpath(FinalXPath).text
print(cell_text)
print()
print("2列显示数据")
print()
for t_row in range(2, (rows + 1)):
FinalXPath = before_XPath + str(t_row) + aftertd_XPath_2
cell_text = driver.find_element_by_xpath(FinalXPath).text
print(cell_text)
print()
print("数据显示在行中,第3列")
print()
for t_row in range(2, (rows + 1)):
FinalXPath = before_XPath + str(t_row) + aftertd_XPath_3
cell_text = driver.find_element_by_xpath(FinalXPath).text
print(cell_text)
读取行中的数据以处理Selenium中的表的输出快照如下:
读取列中的数据以处理硒中的表
对于按列访问Selenium中的句柄表,行保持不变,而列号是可变的,即列是动态计算的。在此Selenium WebDriver教程的下面是XPath,用于访问信息,其中列是可变的,行是恒定的。
XPath访问行:2,列:2 – // * [@@ ==“ customers”] / tbody / tr [2] / td [2]
XPath访问行:2,列:3 – // * [@ id =“ customers”] / tbody / tr [2] / td [3]
XPath访问行:2,列:4 – // * [@ id =“ customers”] / tbody / tr [2] / td [4]
执行for循环时,列的范围为1..4。根据必须访问的行和列,将行值附加到XPath上的是tr [1] / tr [2] / tr [3]。
before_XPath_1 = "//*[@id='customers']/tbody/tr[1]/th["
before_XPath_2 = "//*[@id='customers']/tbody/tr[2]/td["
after_XPath = "]"
for t_col in range(1, (num_columns + 1)):
FinalXPath = before_XPath_1 + str(t_col) + after_XPath
cell_text = driver.find_element_by_xpath(FinalXPath).text
print(cell_text)
完成实施
import unittest
import time
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
test_url = "https://www.w3schools.com/html/html_tables.asp"
before_XPath_1 = "//*[@id='customers']/tbody/tr[1]/th["
before_XPath_2 = "//*[@id='customers']/tbody/tr[2]/td["
after_XPath = "]"
def test_get_row_col_info_(self):
driver = self.driver
driver.get(test_url)
# time.sleep(30)
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CLASS_NAME, "w3-example")))
num_rows = len(driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr"))
# print (rows)
num_columns = len(driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr[2]/td"))
# print(columns)
print("列1中的数据,即标题")
print()
for t_col in range(1, (num_columns + 1)):
FinalXPath = before_XPath_1 + str(t_col) + after_XPath
cell_text = driver.find_element_by_xpath(FinalXPath).text
print(cell_text)
print("列2中的数据")
print()
for t_col in range(1, (num_columns + 1)):
FinalXPath = before_XPath_2 + str(t_col) + after_XPath
cell_text = driver.find_element_by_xpath(FinalXPath).text
print(cell_text)
从执行快照中可以看到,还读取了标题列以获取列的标题。
定位元素以处理硒中的表
此Selenium WebDriver教程的测试目的是在Web表中查找元素的存在。为此,将读取Web表的每个单元格中的内容,并将其与搜索词进行比较。如果存在该元素,则将打印相应的行和元素以处理Selenium中的表。
由于涉及读取每个单元格中的数据,因此我们利用标题为Selenium中的Web表的打印内容的部分中介绍的逻辑。执行不区分大小写的搜索以验证搜索项的存在以处理Selenium中的表。
for t_row in range(2, (num_rows + 1)):
for t_column in range(1, (num_columns + 1)):
FinalXPath = before_XPath + str(t_row) + aftertd_XPath + str(t_column) + aftertr_XPath
cell_text = driver.find_element_by_xpath(FinalXPath).text
if ((cell_text.casefold()) == (search_text.casefold())):
print("搜索文本"+ search_text +" 在第二排 " + str(t_row) + " 和列" + str(t_column))
elem_found = True
break
完成实施
import unittest
import time
from selenium import webdriver
from selenium.webdriver.support.select import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
test_url = "https://www.w3schools.com/html/html_tables.asp"
before_XPath_1 = "//*[@id='customers']/tbody/tr[1]/th["
before_XPath_2 = "//*[@id='customers']/tbody/tr[2]/td["
after_XPath = "]"
search_text = "mAgazzini Alimentari rIUniti"
def test_get_row_col_info_(self):
driver = self.driver
driver.get(test_url)
# time.sleep(30)
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.CLASS_NAME, "w3-example")))
num_rows = len(driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr"))
num_columns = len (driver.find_elements_by_xpath("//*[@id='customers']/tbody/tr[2]/td"))
elem_found = False
for t_row in range(2, (num_rows + 1)):
for t_column in range(1, (num_columns + 1)):
FinalXPath = before_XPath + str(t_row) + aftertd_XPath + str(t_column) + aftertr_XPath
cell_text = driver.find_element_by_xpath(FinalXPath).text
if ((cell_text.casefold()) == (search_text.casefold())):
print("Search Text "+ search_text +" is present at row " + str(t_row) + " and column " + str(t_column))
elem_found = True
break
if (elem_found == False):
print("Search Text "+ search_text +" not found")
如本Selenium WebDriver教程的执行快照所示,搜索词出现在第7行和第1列
尽管可以在Selenium的Web表上执行许多此类操作,但我们已经在本Selenium WebDriver教程中介绍了核心方面。
本文分享自微信公众号 - 软件测试test(gh_d29759b02f67)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
TeamCity VS Jenkins:选择正确的CI / CD工具
每个软件开发周期都涉及三个主要阶段:构建,测试和部署。这三个阶段中的任何一个滞后都会导致产品发布的延迟。为了避免此类延迟,组织依靠CI / CD工具来自动化这些过程。但是最近,随着对CI / CD工具的快速需求,选择泛滥,选择正确的工具可能是艰巨的任务! 您当然应该关注的两个流行的CI / CD工具是Jenkins和TeamCity,它们各自具有自己的独特功能。这两个CI / CD工具广泛用于自动将频繁的代码更改推送到主分支,同时在每个步骤执行DevOps测试以确保构建中的错误更少。 在有关TeamCity vs.Jenkins的这篇文章中,我试图帮助您选择适合您需要的正确CI / CD工具。在开始进行TeamCity与Jenkins的比较之前,我将从CI / CD的基础知识开始。如果您已经知道它,可以直接进入TeamCity vs. Jenkins部分。 什么是CI / CD?为何重要? 在持续集成(CI)中,更改经常被集成到共享存储库中,在其中定期执行构建和DevOps测试(可选步骤)以进行早期错误检测,从而提高了产品质量。将其与持续交付结合使用,您将获得更快,更稳定的构建。 持续...
- 下一篇
Python中的正则表达式和示例
是时候 关注 我们一波了 模块正则表达式(RE)指定与其匹配的一组字符串(模式)。为了理解RE的类比,MetaCharacter是有用的,重要的,并且将在模块re的功能中使用。一共有14个元字符,将在功能中进行讨论: \用来掉落字符的特殊含义 跟随它(在下面讨论)[]代表角色类别^匹配开头$匹配结尾。匹配换行符以外的任何字符?匹配零个或一个匹配项。| 表示OR(与任何字符匹配 被它分开。*任意次数(包括0次)+一次或多次{}指示先前RE的出现次数 匹配。()附上一组RE 函数compile()将正则表达式编译成模式对象,该对象具有用于各种操作的方法,例如搜索模式匹配或执行字符串替换。 importre #compile()创建正则表达式字符类[a-e],#相当于[abcde]。#类[abcde]将与具有“a”、“b”、“c”、“d”、“e”的字符串匹配。p = re.compile('[a-e]') # findall()搜索正则表达式,找到后返回一个列表print(p.findall("找到了")) 输出: ['e','a','d','b','e','a'] 了解输出:第一次出现是“...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16