【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元素
elementp选择所有<p>元素
element,elementdiv,p选择所有<div>和所有<p>元素
element elementdiv p选择<div>的子孙元素<p>
element>elementdiv>p选择<div>的子元素<p>
element+elementdiv+p选择紧接在<div>之后的兄弟元素<p>
element~elementdiv~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]")

 

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值