Selenium自动化测试
1、Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准确抓取到对应元素才能进行后续的自动化控制 ?? ?⑴前面介绍了前端网页HTML是由很多标签元素有层级的组成的,对于某一个标签它在整个网页HTML中的位置是唯一的,因此可以通过某些方法准确的找到这个标签元素并操作它 ?? ?⑵使用WebDriver对象的find_element_by_*函数可以定位一个Web页面元素 ?? ?⑶使用WebDriver对象的find_elements_by_*函数可以定位多个Web页面元素 ?? ? 2、自动化测试步骤:定位元素->操作元素->验证操作结果->记录测试结果
定位单个元素
1、在操作浏览器时较多时候我们仅仅需要定位某一个元素,因此WebDriver提供很多定位单个元素的方法
2、使用Selenium打开一个网页后(get方法返回值)会返回一个WebDriver对象,可以使用该对象下的定位方法来定位某一个元素
3、这些方法都是通过标签的某一属性来定位元素的,因此这些方法有统一的返回值: ?? ?⑴找到元素:返回对应元素的WebElement对象 ?? ?⑵未找到元素:返回NoSuchElementException异常
4、在定位到一个元素后,就需要我们对这个元素进行一些操作了,这里就会使用到WebElement对象的方法或属性了 ?? ?⑴至于WebElement对象的方法、属性我们后面介绍,这里主要介绍元素定位
5、到目前我们就介绍了Selenium中的两个对象了。在使用中我们一定要分清楚当前是哪一个对象,该对象有啥方法或属性了 ?? ?⑴浏览器对象:WebDriver对象 ?? ?⑵元素对象:WebElement对象
id定位
1、HTML语法中规定标签的id属性在当前整个HTML文档中必须是唯一的。因此根据id来定位某一个元素具有很好的精确性
2、语法:浏览器的WebDriver对象.find_element_by_id(id) ?? ?⑴WebDriver提供的id方法就是通过元素的id属性来定位元素的 ?? ?⑵将标签的id属性值作为参数传递给该方法
3、参数: ?? ?⑴id:待定位的元素的id属性值
例1:
# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_id('kw')
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="63133dd1b55c5a4c5981c2f7a0ef1901", element="3b55bd5f-85b7-447c-b5b2-b27d32b934d8")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
# find_element_by_id()方法找到元素后,返回的是一个WebElement对象
? ? ⑴对于WebElement对象的方法、属性我们后面介绍
"""
name定位
1、在HTML语法中元素的name属性值是不唯一的(name属性表示元素的名称) ?? ?⑴因此这个定位方法就有可能定位到多个元素,但只会返回第一个符合要求的元素,即使这个元素并不是我们需要的,因此就需要判断下返回的元素是否是所需要的 ?? ?⑵第一个符合要求的元素:按HTML文档从上到下,第一个符合的元素(标签)
2、语法:浏览器的WebDriver对象.find_element_by_name(name) ?? ?⑴将标签的name属性值作为参数传递给该方法
3、参数: ?? ?⑴name:待定位的元素的name属性值
例2:
?# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_name('wd')
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="a12fc7a048d7f093b5e583dc5a6860f3", element="e3efbf97-103c-4937-af89-095d6c674361")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
"""
class定位
1、在HTML语法中规定使用class属性来指定元素的类名。主要是用来对元素进行分组,并对这一级元素设置相同的样式。所以class属性在当前HTML页面当中也不是唯一的 ?? ?⑴因此这个定位方法就有可能定位到多个元素,但只会返回第一个符合要求的元素,即使这个元素并不是我们需要的
2、语法:浏览器的WebDriver对象.find_element_by_class_name(className) ?? ?⑴将标签的class属性值作为参数传递给该方法 ?? ?⑵该方法的参数只能是一个class值,当class属性有空格隔开两个class的值时,只能选取其中一个进行定位
3、参数: ?? ?⑴className:待定位的元素的class属性值
例3:
?# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_class_name('s_ipt')
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="a12fc7a048d7f093b5e583dc5a6860f3", element="e3efbf97-103c-4937-af89-095d6c674361")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
"""
tag定位
1、HTML的本质就是通过tag(标签)来定义实现不同的功能,每一个元素本质上也是一个tag,由于一个tag往往代表某一类功能,因此通过tag名(标签名)来定位某个元素的概率很低 ?? ?⑴打开任意网页,查看其HTML就会发现有大量的<div>、<input>、<a>等标签,所以很难通过标签名(tag name)去区分不同的元素
2、语法:浏览器的WebDriver对象.find_element_by_tag_name(tagName) ?? ?⑴将标签名作为参数传递给该方法
3、参数: ?? ?⑴tagName:待定位的元素的标签名
4、当HTML页面中存在多个相同标签名的标签时,通过find_element_by_tag_name(tagName)方法返回的是第一个符合条件的标签元素
例4:
?# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_tag_name('input')
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
#当定位到多个元素,只会返回第一个符合要求的元素,即使这个元素并不是我们需要的
<selenium.webdriver.remote.webelement.WebElement (session="4d29ec3477d9fadb75871ba476ff29a0", element="65b90554-ade8-4c4d-9503-e9ecaf11b65d")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
"""
link定位
1、link定位与前面介绍的几种定位方式有所不同,该定位方式是专门用来定义文本连接的:用于定位链接a标签 ?? ?⑴因此这个定位方法就有可能定位到多个元素,但只会返回第一个符合要求的元素,即使这个元素并不是我们需要的
2、语法:浏览器的WebDriver对象.find_element_by_link_text(txt) ?? ?⑴将标签对之间的文本内容作为参数传递给该方法 3、参数: ?? ?⑴txt:标签对之间的文本内容
例5:
?# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_link_text('新闻')
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="e1d7515874cb618f1d857ee0c2d3cc55", element="e1004c6d-528a-4d51-8c3e-ad15ed1ec7bd")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
注:对于同一个元素可能会有多种不同的定位方式,不管用哪种方式,只要定位到的元素是正确的就好了
"""
partial link定位
1、partial_link_text方法定位与link_text方法定位是一样的:用于定位链接a标签 ?? ?⑴link_text用于全部匹配文本值,partial_link_text用于部分匹配文本值:对于标签对之间文本过长时,就可以选取部分文本并使用partial_link_text来定位 ?? ?⑵因此这个定位方法就有可能定位到多个元素,但只会返回第一个符合要求的元素,即使这个元素并不是我们需要的
2、语法:浏览器的WebDriver对象.find_element_by_partial_link_text(txt) ?? ?⑴将标签对之间的部分或完整文本内容作为参数传递给该方法
3、参数: ?? ?⑴txt:标签对之间的文本内容
例6:
?# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_partial_link_text("留学生")
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="53ea3bf54e08d4f961c1669fff51b939", element="8e56a46d-400e-4179-8cfd-74d2b575a677")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
"""
Xpath定位
1、前面介绍的几种定位方式都是根据元素的属性或者标签对值来定位的。但是在大多数情况下可能有些元素并没有对应的属性或属性并不唯一。因此对于找到我们想要得元素有很大的难度
2、因此WebDriver提供了根据元素位置(路径)来定位元素的方式:根据元素在当前整个HTML页面中的位置(路径)来定位元素 ?? ?⑴对于一个元素在整个HTML中的位置(路径)肯定是唯一且固定的,因此根据这个方法来定位到的元素肯定是唯一的 ?? ?⑵元素的路径又分为绝对路径和相对路径
3、语法:浏览器的WebDriver对象.find_element_by_xpath(path) ?? ?⑴将在HTML页面中的路径作为参数传递给该方法
4、参数: ?? ?⑴path:标签在HTML页面中的路径
绝对路径定位
1、find_element_by_xpath()方法使用Xpath语言来定位元素。Xpath主要用标签名的层级关系来表明元素的绝对路径 ?? ?⑴最外层为html标签 ?? ?⑵在body标签内一级一级的往下查找 ?? ?⑶如果一个层级下有多个相同的标签名,那么就按从上到下的顺序确定是第几个。如,div[2]表示当前层级下第二个div标签(从1开始计算的)
2、绝对路径:严格按照路径、同级元素的位置来定位 ?? ?⑴缺点:页面一动,基本崩溃 ?? ?⑵绝对路径格式:以/开头,父/子
3、当然在实际中并不需要我们手动写一个元素的绝对路径,不然就太麻烦了。浏览器一般是提供了获取元素绝对路径等信息的方法 ?? ?⑴这里以谷歌浏览器为例:选中想到定位的元素->鼠标右键->copy->选择复制所需该元素信息(复制的值是啥,我们就用啥) ?? ?⑵copy Xpath:复制该元素的Xpath路径(相对路径) ?? ?⑶copy full Xpath:复制该元素的Xpath路径(绝对路径) ?? ?⑷copy selector:复制该元素的CSS选择器
?例13:
# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_xpath("/html/body/div[1]/div[1]/div[3]/a[3]")
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="933deea97192cef007a0e21bd0820ac6", element="78965292-163c-47f0-99c3-f6b322b2b2e6")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
"""
相对路径定位
1、如果一个元素没有可以唯一标识这个元素的属性值,那么就可以找其上一级元素、上上一级等元素:根据目标标签的父标签等来确定其位置(路径)
2、相对定位:有一个参照物,不考虑路径和位置,只考虑有还是没有,以//开头,//标签名[@属性名称=值]
3、获取元素相对位置的方法与上一个例子中获取绝对路径的方式一样
4、xpath是有自己的一套语法的,具体的可以查看后面的拓展部分 ?? ?⑴//:表示语法开始 ?? ?⑵*:表示所有标签,也可以是具体某个标签名 ?? ?⑶@:表示选取属性id值为s-top-left
?例14:
# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_xpath('//*[@id="s-top-left"]/a[3]')
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="4d26dc53fadcb82b4dec0df0a1583a17", element="d225c171-4763-495c-b85b-5854710cba23")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
"""
使用逻辑运算符
1、如果一个属性不能唯一的区分某一个元素,那么还可以使用逻辑运算符连接多个属性,以便更精确的定位某个元素
2、使用逻辑运算符"and"来连接更多的属性来定位唯一元素
例15:
# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_xpath('//*[@id="kw" and @name="wd"]')
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
# 通过两个属性并存关系来确定唯一元素
<selenium.webdriver.remote.webelement.WebElement (session="ca3da8f65d7326ab60b3981a5c30d58b", element="3348e041-66ee-49bb-9e3d-dc5f3aefd8ab")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
"""
CSS定位
1、CSS主要用于为HTML元素设置CSS样式:在前端页面开发中,一个元素(标签)会有很多样式、属性 ?? ?⑴这些样式、属性并不可能全部写在HTML标签中,更多的时候都是分开来存放的 ?? ?⑵因此在CSS文件中就需要明确的指出该样式是属于哪一个标签元素的。这样才能准确的为对应标签设置属性、样式 ?? ?⑶因此在CSS语法中就规定了如何准确的找到一个标签元素,也就是这里的CSS选择器 ?? ?⑷根据CSS选择器定位到的元素也是唯一的,这样才能保证到精确性
2、在CSS语法中常用的选择器有"id"选择器和"class"选择器。这些选择器也就被Selenium用作定位策略 ?? ?⑴具体的CSS语法在后面拓展部分介绍
3、获取获取元素的CSS选择器的方法与前面例子中获取绝对路径的方式一样,都可以由浏览器直接提供(复制的值是啥,我们就用啥)
例16:
# coding:utf-8
from selenium import webdriver
#打开浏览器
browser ?= webdriver.Chrome()
# 打开百度首页
browser .get("https://www.baidu.com")
# 定位首页输入框
element = browser .find_element_by_css_selector('#kw')
print(element)
print(type(element))
# 关闭浏览器
browser.close()
"""
<selenium.webdriver.remote.webelement.WebElement (session="8089f1b844d0248d9bbc6f498fdb4e0a", element="3d8bdbc2-6425-4539-9e89-66a299f38bd5")>
<class 'selenium.webdriver.remote.webelement.WebElement'>
"""
注: 1、通过Xpath路径和CSS选择器来定位元素比较简便,毕竟其值可以直接由浏览器提供:只需要保证其值是正确的就能定位到唯一元素。而其他定位方法就有可能定位到多个元素 ?? ?⑴通过元素id或xpath或者css选择器来定位元素的话,肯定只会定位到唯一元素(只要值是对的) ?? ?⑵通过元素属性:name、class、tag、link等方式定位的话,就有可能定位到多个元素(只是说只会返回第一个符合要求的元素,即使这个元素可能并不是我们需要的)
2、不过Xpath路径和CSS选择器也会有缺点: ?? ?⑴语法(写法)比较难,需要多理解 ?? ?⑵不稳定:如果HTML页面结构有变化,那么定位可能失效
3、定位方式,优先是id,如果没有id找class,如果class不好定位,找css选择器。我觉得css选择器是最灵活也是最强大的定位方式。使用xpath定位切记不要用绝对路径,最好结合相对路径与属性
用By定位元素
1、前面介绍了8种定位元素的方法,WebDriver还提供了另外一套写法:统一调用find_element()方法
2、该方法通过By来声明定位的方法,并且传入对应定位方法的定位参数
3、语法:find_element(定位方法, 元素属性)
4、源码:可以看到定位方式跟前面介绍的方式是一样的,只是写法不一样 ?? ?⑴不同定位方式统一调用一个方法:只是将具体的定位方式作为第一个参数传给了函数 ?? ?⑵使用find_element()的好处是方法名不会写死,定位方式可以通过参数传
例17:
from selenium import webdriver
#导入所需模块
from selenium.webdriver.common.by import By
# 获取浏览器对象
driver = webdriver.Chrome()
# 打开指定网页
driver.get('https://www.baidu.com/')
# 定位输入框
element = driver.find_element(By.ID,'kw')
print(element)
"""
<selenium.webdriver.remote.webelement.WebElement (session="b6f96a3a99f5e17d8330dbe005fd20db", element="25aace18-cda9-4e13-9288-8c18e36b681d")>
"""
注: 1、其他的定位方法也是一样的写法: ?? ?⑴ID定位:find_element(by=By.ID, value=id) ?? ?⑵name定位:find_element(by=By.NAME, value=name) ?? ?⑶class定位:find_element(by=By.CLASS_NAME, value=name) ?? ?⑷tag定位:find_element(by=By.TAG_NAME, value=name) ?? ?⑸link定位:find_element(by=By.LINK_TEXT, value=link_text) ?? ?⑹partial定位:find_element(by=By.PARTIAL_LINK_TEXT, value=link_text) ?? ?⑺xpath定位:find_element(by=By.XPATH, value=xpath) ?? ?⑻css定位:find_element(by=By.CSS_SELECTOR, value=css_selector)
定位多个元素
1、前面介绍了如何定位一个元素的方法:find_element_by_* ?? ?⑴使用该方法定位元素时,即使HTML页面中存在多个符合要求的元素,但也只会返回第一个符合要求的元素(虽然这个元素可能并不是我们需要的) ?? ?⑵第一个符合要求的元素:按HTML文档结构从上到下的第一个
2、定位多个元素的方法与定位单个元素的方法类似,唯一的区别是在接口函数element后面多了一个s表示复数 ?? ?⑴定位多个元素(具有相同属性的一类元素)的函数:find_elements_by_* ?? ?⑵定位多个元素的方法与定位单个元素的方法是一样的:依旧是id、name、class、tag、link、partial_link、xpath、css ?? ?⑶find_elements_by_*方法返回的是一个列表,由所有符合要求的标签对象组成的列表
3、定位多个元素一般用于以下场景: ?? ?⑴批量操作元素:例如勾选所有的复选框 ?? ?⑵先获取多个元素(多个属性一样的元素),再从这多个元素中过滤出我们需要操作的元素
过滤元素
1、当HTML页面中存在多个相同属性的标签元素时,通过find_elements_by_*方法返回的是一个由所有符合要求的元素组成的列表
2、此时如果我们想要操作这其中的一个元素标签,那么就需要通过一定方法将我们需要的标签过滤出来进行操作
例18:
?from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 打开指定网页
driver.get("https://www.baidu.com/")
# 定位input标签
element = driver.find_element_by_tag_name('input')
print(element)
"""
# 页面中存在多个相同属性的元素时,只会返回第一个符合要求的元素,即使这个元素可能并不是我们需要的
<selenium.webdriver.remote.webelement.WebElement (session="6228e958fa8d79bc60c365676e3f962d", element="f132b614-696d-4b61-83bd-ddf615e4a188")>
"""
注: 1、可以看到在一个HTML页面中可能存在很多属性一样的元素(标签),因此通过某些方法来定位时获取到的可能并不是我们需要的
2、这时我们可以先获取到全部的元素(这一类具有相同属性的元素),然后过滤出我们需要的某个具体元素
例19:
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 打开指定网页
driver.get("https://www.baidu.com/")
# 获取到全部的input标签
elements = driver.find_elements_by_tag_name('input')
print(elements)
"""
注:find_elements_by_*方法返回的是一个列表,所有符合要求的元素组成的列表
[<selenium.webdriver.remote.webelement.WebElement (session="e8e0c7e1d31dfef6e08058f45c77ae76", element="cc9eae76-0378-4a60-b1d7-cc820c65ec04")>,?
<selenium.webdriver.remote.webelement.WebElement (session="e8e0c7e1d31dfef6e08058f45c77ae76", element="6717a195-2156-485e-8a5d-8771ed4a9c8e")>,?
<selenium.webdriver.remote.webelement.WebElement (session="e8e0c7e1d31dfef6e08058f45c77ae76", element="f3d4c305-e1e0-4e6b-9227-ef44d2830fa1")>,?
....
"""
# 对所有符合要求的元素进行遍历
for element in elements:
? ? # 判断元素的属性id是否为kw
? ? if element.get_attribute("id") == "kw":
? ? ? ? print(element)
? ? else:
? ? ? ? pass
"""
<selenium.webdriver.remote.webelement.WebElement (session="e8e0c7e1d31dfef6e08058f45c77ae76", element="158c7e23-0b08-4c17-adb8-14be9a2e98c9")>
"""
注: 1、find_elements_by_*方法返回的是一个列表,由所有符合要求的标签对象组成的列表
2、这里提到了一个element对象方法:get_attribute(属性名) ?? ?⑴用于返回element对象的指定属性值
3、这里只是介绍下这种定位某一个元素的方法,实际上直接根据唯一属性来定位会方便很多,这里只是提供一个思路 ?? ?⑴先通过find_elements_by_*方法找到所有符合要求的元素 ?? ?⑵然后在通过某些特定属性来过滤出我们需要的元素标签:这里说的属性不仅仅是id、name之类的,只要是开始标签内的任意属性都可以,比如type啥的
批量操作元素
1、有时我们需要批量操作某一类相同属性的标签元素:例如勾选所有的复选框
2、虽然我们可以依次将需要的复选框定位出来并依次操作,不过这样就会显得有点麻烦
3、最好的做法时一次性找到所有的复选框,然后依次进行勾选,就不需要多次定位了
例20:由于在网上没找到有复选框的网页,因此就简单写了一个demo
<!DOCTYPE html>
<html lang="en">
<head>
? ? <meta charset="UTF-8">
? ? <title>checkbox和radio</title>
</head>
<body>
? ? <br>
? ? <fieldset>
? ? ? ? <legend>每个checkbox的name属性值可以一样,也可以不一样</legend>
? ? ? ? <input type="checkbox" name="cb4" value="">草莓 <br>
? ? ? ? <input type="checkbox" name="cb4" value="">橘子 <br>
? ? ? ? <input type="checkbox" name="cb4" value="">甘蔗 <br>
? ? </fieldset>
</body>
</html>
例21:依次定位并操作
?from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 打开指定网页
file = "C:\Py_Demo\Demo\Py_Project\demo.html"
driver.get(file)
# 依次定位每一个checkbox勾选框
one = driver.find_element_by_xpath('/html/body/fieldset/input[1]')
two = driver.find_element_by_xpath('/html/body/fieldset/input[2]')
three = driver.find_element_by_xpath('/html/body/fieldset/input[3]')
print(one)
print(two)
print(three)
"""
<selenium.webdriver.remote.webelement.WebElement (session="2d6ced48f15f0ec06d8b87f557d27a92", element="52121bb9-80e3-423d-866a-bb4c65cc214e")>
<selenium.webdriver.remote.webelement.WebElement (session="2d6ced48f15f0ec06d8b87f557d27a92", element="ef56388b-e2b2-4be0-9130-092fe16c844b")>
<selenium.webdriver.remote.webelement.WebElement (session="2d6ced48f15f0ec06d8b87f557d27a92", element="f416c037-5cc5-43f0-bb26-54e485b6ec33")>
"""
例22:一次性定位所有符合条件的标签
from selenium import webdriver
# 获取浏览器对象
driver = webdriver.Chrome()
# 打开指定网页
file = "C:\Py_Demo\Demo\Py_Project\demo.html"
driver.get(file)
# 一次性定位所有checkbox勾选框
elements = driver.find_elements_by_name('cb4')
print(elements)
"""
[<selenium.webdriver.remote.webelement.WebElement (session="13eb3699c3fa343d4e593c188647b04b", element="779b3298-615d-490e-90e4-9f035b42d024")>,
?<selenium.webdriver.remote.webelement.WebElement (session="13eb3699c3fa343d4e593c188647b04b", element="89cf5edd-b349-4cb3-9e50-c8cc69828d85")>,
? <selenium.webdriver.remote.webelement.WebElement (session="13eb3699c3fa343d4e593c188647b04b", element="b9e2662e-9abf-4fb9-9dfc-a8041caf6b14")>]
"""
# 对所有元素进行遍历
for element in elements:
? ? print(element)
"""
<selenium.webdriver.remote.webelement.WebElement (session="f82958e25c5e654bed7f551271659be2", element="9c70c355-873f-49c8-b751-f82b6f1e13ee")>
<selenium.webdriver.remote.webelement.WebElement (session="f82958e25c5e654bed7f551271659be2", element="cdd30b39-2296-4245-a223-5dca182ef435")>
<selenium.webdriver.remote.webelement.WebElement (session="f82958e25c5e654bed7f551271659be2", element="f779476c-0907-463d-aab5-6f8bd7d747e4")>
"""
# 对所有元素进行索引
print(elements[1])
"""
<selenium.webdriver.remote.webelement.WebElement (session="0567976c5b2a96f0109c57cf9e0f44fb", element="289948cf-f10b-4af9-b106-929235907865")>
"""
注: 1、find_elements_by_*方法返回的是一个由所有符合要求的标签对象组成的列表
2、因此可以对这个列表进行各种列表操作,比如遍历、索引等等 ?? ?⑴遍历:依次遍历出各个元素,并进行元素操作,如点击等 ?? ?⑵索引:索引出想要的某一个元素,只对该元素进行操作(列表中标签对象顺序与在HTML文档中的顺序一致) 3、定位多个元素也支持find_elements()写法 ?? ?⑴ID定位:find_elements(by=By.ID, value=id) ?? ?⑵name定位:find_elements(by=By.NAME, value=name) ?? ?⑶class定位:find_elements(by=By.CLASS_NAME, value=name) ?? ?⑷tag定位:find_elements(by=By.TAG_NAME, value=name) ?? ?⑸link定位:find_elements(by=By.LINK_TEXT, value=link_text) ?? ?⑹partial定位:find_elements(by=By.PARTIAL_LINK_TEXT, value=link_text) ?? ?⑺xpath定位:find_elements(by=By.XPATH, value=xpath) ?? ?⑻css定位:find_elements(by=By.CSS_SELECTOR, value=css_selector) ?? ? 例23:使用find_elements()方法定位
from selenium import webdriver
#导入所需模块
from selenium.webdriver.common.by import By
# 获取浏览器对象
driver = webdriver.Chrome()
# 打开指定网页
file = "C:\Py_Demo\Demo\Py_Project\demo.html"
driver.get(file)
# 一次性定位所有checkbox勾选框
elements = driver.find_elements(By.NAME,'cb4')
print(elements)
"""
[<selenium.webdriver.remote.webelement.WebElement (session="13eb3699c3fa343d4e593c188647b04b", element="779b3298-615d-490e-90e4-9f035b42d024")>,
?<selenium.webdriver.remote.webelement.WebElement (session="13eb3699c3fa343d4e593c188647b04b", element="89cf5edd-b349-4cb3-9e50-c8cc69828d85")>,
? <selenium.webdriver.remote.webelement.WebElement (session="13eb3699c3fa343d4e593c188647b04b", element="b9e2662e-9abf-4fb9-9dfc-a8041caf6b14")>]
"""
# 对所有元素进行遍历
for element in elements:
? ? print(element)
"""
<selenium.webdriver.remote.webelement.WebElement (session="f82958e25c5e654bed7f551271659be2", element="9c70c355-873f-49c8-b751-f82b6f1e13ee")>
<selenium.webdriver.remote.webelement.WebElement (session="f82958e25c5e654bed7f551271659be2", element="cdd30b39-2296-4245-a223-5dca182ef435")>
<selenium.webdriver.remote.webelement.WebElement (session="f82958e25c5e654bed7f551271659be2", element="f779476c-0907-463d-aab5-6f8bd7d747e4")>
"""
# 对所有元素进行索引
print(elements[1])
"""
<selenium.webdriver.remote.webelement.WebElement (session="0567976c5b2a96f0109c57cf9e0f44fb", element="289948cf-f10b-4af9-b106-929235907865")>
"""
拓展
Xpath语法
1、XPath 使用路径表达式来选取XML、HTML文档中的节点或节点集。节点是通过沿着路径(path)或者步(steps)来选取的
2、下面介绍写常用的路径表达式
CSS选择器语法
1、CSS选择器用于选择你想要的元素的样式的模式
2、参考文档:https://www.runoob.com/cssref/css-selectors.html
Xpath语法与CSS选择器语法的差别
?
|