Selenium 简明教程
Selenium Webdriver - Identify Multiple Elements
在本章中,我们将学习如何通过各种选项来识别多个元素。让我们从理解通过 ID 识别多个元素开始。
By Class name
一旦我们导航到一个网页,我们就必须与页面上可用的网络元素交互,例如单击链接/按钮、在编辑框中输入文本等等,才能完成我们的自动化测试用例。
为此,我们的首要任务是识别元素。我们可以对元素使用 class 属性进行识别,并利用方法 find_elements_by_class_name。这样,所有具有与属性 class 匹配值的所有元素都以列表形式返回。
如果不存在具有类属性匹配值的元素,则返回一个空列表。
识别多个 Classname 的 syntax 如下 −
driver.find_elements_by_class_name("value of class attribute")
让我们看看具有如下所示 class 属性的网络元素的 html 代码 −
上图中突出显示的 class 属性的值为 toc chapters。让我们尝试计算此类网络元素的数量。
Code Implementation
通过 Classname 识别多个元素的代码实现如下 −
from selenium import webdriver
driver = webdriver.Chrome(executable_path='../drivers/chromedriver')
#implicit wait time
driver.implicitly_wait(5)
#url launch
driver.get("https://www.tutorialspoint.com/about/about_careers.htm")
#identify elements with class attribute
l = driver.find_elements_by_class_name("chapters")
#count elements
s = len(l)
print('Count is:')
print(s)
#driver quit
driver.quit()
输出显示的消息为 - 进程退出代码 0,这意味着上面的 Python 代码执行成功。此外,具有类属性值 chapters(从 len 方法获得)的网络元素总数(2)将打印在控制台中。
By Tagname
一旦我们导航到一个网页,我们就必须与页面上可用的网络元素交互,例如单击链接/按钮、在编辑框中输入文本等等,才能完成我们的自动化测试用例。
为此,我们的首要任务是识别元素。我们可以对元素使用标签名进行识别,并利用方法 find_elements_by_tag_name。这样,所有具有与标签名匹配值的所有元素都以列表形式返回。
如果不存在具有与标签名匹配值的元素,则返回一个空列表。
通过 Tagname 标识多个元素的 syntax 如下所示 −
driver.find_elements_by_tag_name("value of tagname")
让我们看看 webelement 的 html 代码,如下所示 −
上图中突出显示的 tagname 的值为 h4。让我们尝试计算具有 tagname 为 h4 的 webelement 的数量。
Code Implementation
通过 Tagname 标识多个元素的代码实现如下 −
from selenium import webdriver
driver = webdriver.Chrome(executable_path='../drivers/chromedriver')
#implicit wait time
driver.implicitly_wait(5)
#url launch
driver.get("https://www.tutorialspoint.com/index.htm")
#identify elements with tagname
l = driver.find_elements_by_tag_name("h4")
#count elements
s = len(l)
print('Count is:')
print(s)
#driver quit
driver.quit()
输出显示消息 - 退出代码为 0 的进程,表示上面的 Python 代码执行成功。此外,具有 tagname 为 h4 的 webelement 的总数(从 len 方法中获取) - 1 将打印在控制台中。
By Partial Link Text
一旦我们导航到一个网页,我们可能需要通过单击链接与 webelement 进行交互以完成我们的自动化测试用例。部分链接文本用于具有锚标记的元素。
为了达到这个目的,我们的首要任务是标识元素。我们可以为元素使用部分链接文本属性以对其进行标识并使用 find_elements_by_partial_link_text 方法。这样,所有具有给定部分链接文本匹配值的元素将以列表形式返回。
如果没有具有该部分链接文本匹配值的元素,则返回一个空列表。
通过部分链接文本标识多个元素的 syntax 如下所示 −
driver.find_elements_by_partial_link_text("value of partial link text")
让我们看看链接的 html 代码,如下所示 −
上图中突出显示的链接 - 使用条款具有 tagname - a 和部分链接文本 - 条款。让我们在对其进行标识后尝试获取该文本。
Code Implementation
通过部分链接文本标识多个元素的代码实现如下 −
from selenium import webdriver
driver = webdriver.Chrome(executable_path='../drivers/chromedriver')
#implicit wait time
driver.implicitly_wait(5)
#url launch
driver.get("https://www.tutorialspoint.com/about/about_careers.htm")
#identify elements with partial link text
l = driver.find_elements_by_partial_link_text('Terms')
#count elements
s = len(l)
#iterate through list
for i in l:
#obtain text
t = i.text
print('Text is: ' + t)
#driver quit
driver.quit()
输出显示消息 - 退出代码为 0 的进程,表示上面的 Python 代码执行成功。此外,具有部分链接文本定位器(从文本方法中获取)标识的链接文本 - 使用条款将打印在控制台中。
By Link Text
一旦我们导航到一个网页,我们可能需要通过单击链接与 webelement 进行交互以完成我们的自动化测试用例。链接文本用于具有锚标记的元素。
为了达到这个目的,我们的首要任务是标识元素。我们可以为元素使用链接文本属性以对其进行标识并使用 find_elements_by_link_text 方法。这样,所有具有给定链接文本匹配值的元素将以列表形式返回。
如果没有具有该链接文本匹配值的元素,则返回一个空列表。
通过链接文本标识多个元素的 syntax 如下所示 −
driver.find_elements_by_link_text("value of link text")
让我们看看链接的 html 代码,如下所示 −
上图中突出显示的链接 - Cookie 政策具有 tagname - a 和链接文本 - Cookie 政策。让我们在对其进行标识后尝试获取该文本。
Code Implementation
通过链接文本标识多个元素的代码实现如下 −
from selenium import webdriver
driver = webdriver.Chrome(executable_path='../drivers/chromedriver')
#implicit wait time
driver.implicitly_wait(5)
#url launch
driver.get("https://www.tutorialspoint.com/about/about_careers.htm")
#identify elements with link text
l = driver.find_elements_by_link_text('Cookies Policy')
#count elements
s = len(l)
#iterate through list
for i in l:
#obtain text
t = i.text
print('Text is: ' + t)
#driver quit
driver.quit()
输出显示了信息 - 进程退出代码 0,表明上述 Python 代码已成功执行。此外,带有链接文本定位器(从 text 方法获取)的链接文本 - Cookies 政策将在控制台打印出来。
By Name
一旦我们导航到一个网页,我们就必须与页面上可用的网络元素交互,例如单击链接/按钮、在编辑框中输入文本等等,才能完成我们的自动化测试用例。
为此,我们的第一个任务是识别元素。我们可以使用元素的 name 属性进行识别并使用 find_elements_by_name 方法。使用此方法,具有匹配属性值 name 的元素将以列表的形式返回。
如果没有与 name 属性匹配值的元素,则将返回一个空列表。
用于按名称识别多个元素的 syntax 如下 −
driver.find_elements_by_name("value of name attribute")
让我们看看以下 web 元素的 html 代码 −
上图中突出显示的编辑框具有值为 search 的 name 属性。让我们尝试识别该编辑框后向其中输入一些文本。
Code Implementation
通过名称识别多个元素的代码实现如下 −
from selenium import webdriver
driver = webdriver.Chrome(executable_path='../drivers/chromedriver')
#implicit wait time
driver.implicitly_wait(5)
#url launch
driver.get("https://www.tutorialspoint.com/index.htm")
#identify elements with name attribute
l = driver.find_elements_by_name('search')
#count elements
s = len(l)
#iterate through list
for i in l:
#obtain text
t = i.send_keys('Selenium Python')
v = i.get_attribute('value')
print('Value entered is: ' + v)
#driver quit
driver.quit()
输出显示了信息 - 进程退出代码 0,表明上述 Python 代码已成功执行。此外,在编辑框中输入的值(从 get_attribute 方法获取) - Selenium Python 会在控制台打印出来。
By CSS Selector
一旦我们导航到一个网页,我们就必须与页面上可用的网络元素交互,例如单击链接/按钮、在编辑框中输入文本等等,才能完成我们的自动化测试用例。
为此,我们的第一个任务是识别元素。我们可以为它们创建 css 选择器并使用 find_elements_by_css_selector 方法。使用此方法,具有匹配给定 css 值的元素将以列表的形式返回。
如果没有与 css 匹配值的元素,则将返回一个空列表。
用于通过 CSS 选择器识别多个元素的 syntax 如下 −
driver.find_elements_by_css_selector("value of css")
Rules for CSS Expression
创建 css 表达式的规则在下面讨论 −
-
要使用 css 识别元素,表达式应为标签名[属性='值']。我们还可以专门使用 id 属性来创建 css 表达式。
-
使用 id,css 表达式的格式应为标签名#id。例如,input#txt [这里输入是标签名,txt 是 id 属性的值]。
-
使用 class,css 表达式的格式应为标签名.class。例如,input.cls-txt [这里输入是标签名,cls-txt 是 class 属性的值]。
-
如果父元素有 n 个子元素,并且我们想识别第 n 个子元素,那么 css 表达式应具有 nth-of –type(n)。
在上面的代码中,如果我们想识别 ul[Questions and Answers] 的第四个 li 子元素,则 css 表达式应为 ul.reading li:nth-of-type(4)。类似地,要识别最后一个子元素,css 表达式应为 ul.reading li:last-child。
对于值动态更改的属性,我们可以使用 ^= 来查找其属性值以特定文本开头的元素。例如,input[name^='qa'] [这里输入是标签名,name 属性的值以 qa 开头]。
对于值动态更改的属性,我们可以使用 $= 来查找其属性值以特定文本结尾的元素。例如,input[class$='txt'] 这里,输入是标签名,class 属性的值以 txt 结尾。
对于值动态变化的属性,我们可以使用 = to locate an element whose attribute value contains a specific sub-text. For example, input[name ='nam']。此处,input 是标签名称,而 name 属性的值包含子文本 nam。
让我们看看一个 web 元素的 html 代码:
上面图像中突出显示的编辑框具有值的搜索 name 属性,css 表达式应为 input[name='search']。让我们在 identification 它后尝试在此编辑框中输入一些文本。
Code Implementation
通过 CSS 选择器识别多个元素的代码实现如下:
from selenium import webdriver
driver = webdriver.Chrome(executable_path='../drivers/chromedriver')
#implicit wait time
driver.implicitly_wait(5)
#url launch
driver.get("https://www.tutorialspoint.com/index.htm")
#identify elements with css
l = driver.find_elements_by_css_selector("input[name='search']")
#count elements
s = len(l)
#iterate through list
for i in l:
#obtain text
t = i.send_keys('Tutorialspoint')
v = i.get_attribute('value')
print('Value entered is: ' + v)
#driver quit
driver.quit()
输出显示消息 - 进程退出代码为 0,表示上面的 Python 代码已成功执行。此外,在编辑框内输入的值(从 get_attribute 方法获取) - Tutorialspoint 会打印在控制台中。
By Xpath
一旦我们导航到一个网页,我们就必须与页面上可用的网络元素交互,例如单击链接/按钮、在编辑框中输入文本等等,才能完成我们的自动化测试用例。
为此,我们的第一个任务是识别元素。我们可以为它们的 identification 创建一个 xpath,并使用 find_elements_by_xpath 方法。这样,具有给定 xpath 匹配值 的元素将以列表的形式返回。
如果没有元素具有与 xpath 匹配的值,则将返回一个空列表。
通过 Xpath identification 多个元素的 syntax 如下:
driver.find_elements_by_xpath("value of xpath")
Rules for Xpath Expression
创建 xpath 表达式的规则如下所述:
-
要使用 xpath 识别元素,表达式应为 //tagname[@attribute='value']。xpath 可以有两种类型 - 相对和绝对。绝对 xpath 以 / 符号开头,从根节点开始到我们想要 identification 的元素。
例如,
/html/body/div[1]/div/div[1]/a
-
相对 xpath 以 // 符号开头,不从根节点开始。
例如,
//img[@alt='tutorialspoint']
让我们从根部开始看高亮链接 - 主页的 html 代码。
元素主页的绝对 xpath 如下:
/html/body/div[1]/div/div[1]/a.
元素主页的相对 xpath 可以如下:
//a[@title='TutorialsPoint - Home'].
Functions
还有一些函数可以帮助构建相对 xpath 表达式:
text()
它用于借助页面上的可见文本来 identification 元素。xpath 表达式如下:
//*[text()='Home'].
starts-with
它用于 identification 其属性值以特定文本开头的元素。此函数通常用于在每个页面加载时其值都会发生变化的属性。
让我们查看元素 Q/A 的 html −
xpath 表达式应如下 −
//a[starts-with(@title, 'Questions &')].
contains()
它标识一个其属性值包含子文本的元素。此函数通常用于在每次页面加载时都会更改其值的属性。
xpath 表达式如下 −
//a[contains(@title, 'Questions & Answers')].
让我们看看一个 web 元素的 html 代码:
上图中高亮的编辑框有一个名为搜索的属性,xpath 表达式应为 //input[@name='search']。让我们在识别出此编辑框后尝试在其中输入一些文本。
Code Implementation
通过 Xpath 识别多个元素的代码实现如下 −
from selenium import webdriver
driver = webdriver.Chrome(executable_path='../drivers/chromedriver')
#implicit wait time
driver.implicitly_wait(5)
#url launch
driver.get("https://www.tutorialspoint.com/index.htm")
#identify elements with xpath
l = driver.find_elements_by_xpath("//input[@name='search']")
#count elements
s = len(l)
#iterate through list
for i in l:
#obtain text
t = i.send_keys('Tutorialspoint - Selenium')
v = i.get_attribute('value')
print('Value entered is: ' + v)
#driver quit
driver.quit()
输出显示消息 - 进程退出代码 0,表示上述 Python 代码已成功执行。此外,在编辑框中输入的值(从 get_attribute 方法获取) - Tutorialspoint - Selenium 将打印在控制台中。