【selenium】定位方式

一、根据id定位

以百度网址首页为例,按f12打开开发者工具,查看页面元素信息。

<!-- 百度主页下的搜索输入框html结构 -->
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
driver.find_element(By.ID, "kw")

二、根据name定位

driver.find_element(By.NAME, "wd")

三、根据class定位

driver.find_element(By.CLASS_NAME, "s_ipt")

如果class属性的值含有空格,使用class定位会报错

四、根据tag_name定位

tag为标签,tag_name是通过html中的标签名进行定位的。通常页面中的标签不唯一,不能只通过tag_name进行精确定位。

# 找出所有input标签
tag_input = driver.find_elements(By.TAG_NAME, "input")
    for i in tag_input:
        # 找出input标签中id属性是kw的
        if i.get_attribute('id') == 'kw':
        # 执行需要的动作
        i.send_keys("tag定位")

五、根据link_text定位

<!-- 百度主页下的hao123链接的html结构 -->
<a href="https://www.hao123.com?src=from_pc_logon" target="_blank" class="mnav c-font-normal c-color-t">hao123</a>

link_text和partial_link_text定位的是<a>标签内的文本。

link_text是精确匹配。

driver.find_element(By.LINK_TEXT, "hao123")

六、根据partial_link_text定位

partial_link_text是模糊匹配。

driver.find_element(By.PARTIAL_LINK_TEXT, "hao")

七、根据css_selector定位

css_selector定位又可以细分为id选择器、class选择器、标签选择器和属性选择器。

同样还是百度首页搜索输入框的例子。

1、id选择器

driver.find_element(By.CSS_SELECTOR, "#kw")

2、class选择器

driver.find_element(By.CSS_SELECTOR, ".s_ipt")

如果class属性的值含有空格,每一个空格前都要加“.”

driver.find_element(By.CSS_SELECTOR, ".bg.s_btn")

3、标签选择器

driver.find_element(By.CSS_SELECTOR, "input")

4、属性选择器

driver.find_element(By.CSS_SELECTOR, "[id='kw']")

5、常用css selector

选择器 例子 例子描述
.class .s_ipt 选择class=“s_ipt”的元素
#id #kw 选择id="kw"的元素
* ^ $

class*="ip"

class^="s_"

class$="pt"

选择包含ip/以s_k开头/以pt结尾的class元素
element p 选择所有<p>元素
element,element div,p 选择所有<div>和所有<p>元素
element element div p 选择<div>的子孙元素<p>
element>element div>p 选择<div>的子元素<p>
element+element div+p 选择紧接在<div>之后的兄弟元素<p>
element~element div~p 选择在<div>之后的所有兄弟元素<p>
[attribute] [target] 选择带有target属性的元素
[attribute=value] [target="_blank"] 选择target属性为_blank的元素
:nth-child(n)

p:nth-child(2)

p:nth-last-child(2)

选择是其父元素的(倒数)第二个子元素的<p>元素

逻辑定位

各选择器通常可以结合使用,不需要使用逻辑运算符连接。

“标签名[属性1= 属性值][属性2=属性值]”。

# 选择id属性为kw并且name属性为wd同时class属性为s_ipt的input元素
driver.find_element(By.CSS_SELECTOR, "input[id = 'kw'][name = 'wd'].s_ipt")

nth-child(n)和nth-last-child(n)

定位(倒数)第n个子元素。是所有子元素的第n个,而不是这个标签的第n个。如果位置和标签不对应会无法定位。

# 选择父元素class属性为s-top-left-new s-isindex-wrap的第二个子元素a
driver.find_element(By.CSS_SELECTOR, "[class='s-top-left-new s-isindex-wrap']>a:nth-child(2)")

八、根据xpath定位

1、绝对路径

从html根节点层层定位,路径唯一。即便页面代码结构只发生了微小的变化,也可能会使原先有效的xpath定位表达式定位失败。通常不推荐使用。

driver.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input')

2、相对路径

从当前节点进行定位,不考虑在整个html页面中的位置。一般不会受页面结构变化的影响。

driver.find_element(By.XPATH, "//*[@id='kw']")

3、常用xpath

表达式 描述 例子
/ 从根节点选取(取子节点)。简单理解为绝对路径。 /html/body/div[1]/div[1]
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)。简单理解为相对路径。 //input/div//span
. 选取当前节点。  
.. 选取当前节点的父节点。 //input/.. 
@ 选取属性。 //@lang
* 通配符,表示任意节点或任意属性 //*

属性定位

直接通过属性名定位,“//标签名[@属性='属性值']”。

driver.find_element(By.XPATH, "//input[@name='wd']")

text()

通过标签内的文本定位,“//标签名[text()='文本内容']”。

driver.find_element(By.XPATH, "//a[text()='hao123']")

contains()

模糊定位,通过某属性的值的一部分定位。

“//标签名[contains(@属性, '属性值')]”,“//标签名[contains(text(), '文本内容')]”

# 都是定位到百度主页下的hao123
driver.find_element(By.XPATH, "//a[contains(@href, 'src=from_pc')]")
driver.find_element(By.XPATH, "//a[contains(text(), 'hao')]")

逻辑定位

通过多个属性标签进行定位。使用“and、or、not”逻辑运算符进行连接。

"//标签名[@属性='属性值' and/or @属性='属性值']","//标签名[not(@属性='属性值')]"

# 都是定位到百度主页下的搜索输入框
driver.find_element(By.XPATH, "//input[@id='kw' or @name='wd']")
driver.find_element(By.XPATH, "//input[not(@id='xx') and @name='wd']")

position()

选择需要定位的标签在其父元素的所以子元素中的位置。(倒数)第几个。

"标签名[n]"、"标签名[last()-n]"、"标签名[position()=n]"。last()为最后一个,last()-1为倒数第二个。

position()相比前两种,可以使用“<、>”等符号进行范围定位,前几个或者后几个。

# 都是定位到百度主页下的hao123
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[2]")
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[last()-5]")
driver.find_element(By.XPATH, "//div[@id='s-top-left']/a[position()=2]")

猜你喜欢

转载自blog.csdn.net/Yocczy/article/details/129616199
今日推荐