您的位置:首页 > 健康 > 美食 > 【selenium】 元素定位

【selenium】 元素定位

2024/12/23 7:19:20 来源:https://blog.csdn.net/xubeiqiannian/article/details/123402229  浏览:    关键词:【selenium】 元素定位

元素定位

    • 1、 一般元素定位方式
    • 2、通过xpath定位
      • 2.1 绝对路径定位
      • 2.2 利用元素属性定位
      • 2.3 层级和属性结合定位
      • 2.4 使用逻辑运算符定位
    • 3、通过css定位元素
    • 4、通过By 定位元素
    • 5、定位一组元素
    • 6、浏览器自带的元素辅助定位功能:

1、 一般元素定位方式

示例网页:

......
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
<a href="http://tieba.baidu.com/" target="_blank" class="mnav c-font-normal c-color-t">贴吧</a>
<a href="https://wenku.baidu.com/?fr=bdpcindex" target="_blank" class="mnav c-font-normal c-color-t">一个文本很长的超链接</a>
......
  1. 通过id定位: driver.find_element_by_id("kw")
  2. 通过name定位 :driver.find_element_by_name("wd")
  3. 通过class定位 :driver.find_element_by_class_name("s_ipt")
  4. 通过tag定位:driver.find_element_by_tag_name("input") tag指标签 <input>、<div>、<a>
  5. 通过link定位 :driver.find_element_by_link_text("贴吧")
  6. 通过partical link定位 :driver.find_element_by_partical_link_text("一个文本")

2、通过xpath定位

2.1 绝对路径定位

原理: 类似通过xx省xx市xx区xx路xx号来定位一个人的住址,实际是通过dom树结构定位元素位置
语法:driver.find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
说明:/表示层级关系,div[2]表示第2个div

2.2 利用元素属性定位

原理:通过元素的属性值来定位元素
语法:

  • find element by_xpath("//input[@id='kw']")
  • find element by_xpath("//input[@maxlength='100']")
  • find element by _xpath("//input[@autocomplete='off]")
  • find element by xpath("//input[@name='wd']")
  • find element by xpath("//*[@class='bg s btn']")

说明:

  • //input表示当前页面的某个目录下的input标签
  • [@id='kw'] 使用属性id ,对应的属性值是 kw
  • //* 不指定标签名,在所有标签中查找

2.3 层级和属性结合定位

原理:某些元素没有特殊的属性可以定位,可以先通过属性定位他的父级元素,然后再通过层级关系定位到这个元素

<form class="numberform"><input value="ejxjdsjjsssddn"><input value="ssmkdlfnskslss">
</form>

通过form父元素定位子元素中的第二个input : driver.find_elment_by_xpath('//form[@class="numberform"]/input[2]')

2.4 使用逻辑运算符定位

<input class="listitem" name="z1">
<input class="listitem" name="z1">
<input class="listitem" name="z2">

通过 and 连接两个属性来定位元素
driver.find_elment_by_xpath('//input[@class="listitem" and @name="z2"])

3、通过css定位元素

  1. 通过id定位: driver.find_element_by_css_selector("#kw")
  2. 通过class定位 :driver.find_element_by_css_selector(".s_ipt")
  3. 通过tag定位:driver.find_element_by_css_selector("form>input")
  4. 通过属性定位: driver.find_element_by_css_selector("[name='kw']")
  5. 组合定位:find element by_css selector("span.s_ipt>input.s_ip") 定位标签为span class=s_ipt下的input标签,且input标签的class= s_ip

xpath和css定位对比

定位方式xpathcss
标签//divdiv
by_id//div[@id=‘elid’]div#elid
by_class//div[@class=‘elclass’]div.elclass
属性//div[@title=‘move mouse here’]div[title=Move mouse here] 或 div{title^=Move] 或div[title$=here] 或 div[title*=mouse]
定位子元素//div/parent/childdiv>parent>child

4、通过By 定位元素

通过By定位元素其实是针对以上三种方式的整合,其原理不变,使用示例如下:

from selenium.webdriver.common.by import Bydriver.find_element(By.ID,"kw")
driver.find_element(By.NAME,"wd")
driver.find_element(By.CLASS NAME,"'s ipt")
driver.find_element(By.TAG NAME,"input")
driver.find_element(By.LINK TEXT,"新闻")
driver.find_element(By.PARTIAL LINK TEXT,"新")
driver.find_element(By.XPATH,"//*[@class='bg s btn']")
driver.find_element(By.CSS SELECTOR,"span.bg s btn wr>input#su")

5、定位一组元素

定位一组元素与定位一个元素的方式类似

  • 单个元素定位: driver.find_element_by_xx
  • 多个元素定位: driver.find_elements_by_xx

示例:

定位单个元素定位一组元素
driver.find_element_by_class_name(“s_ipt”)driver.find_elements_by_class_name(“s_ipt”)
driver.find_element_by_xpath(“//*[@class=‘bg’]”)find_elements_by_xpath(“//*[@class='bg]”)
driver.find_element_by_css_selector(“[name=‘kw’]”)driver.find_elements_by_css_selector(“[name=‘kw’]”)
driver.find_element(By.CLASS NAME,“'s ipt”)driver.find_elements(By.CLASS NAME,“'s ipt”)

对一组元素进行操作,如选中下拉控件的每一个元素
html如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>多选控件示例</title>
</head>
<body>
<h2>请选择您喜欢的水果:</h2>
<form><input type="checkbox" id="apple" name="fruits" value="apple"><label for="apple">苹果</label><br><input type="checkbox" id="banana" name="fruits" value="banana"><label for="banana">香蕉</label><br><input type="checkbox" id="orange" name="fruits" value="orange"><label for="orange">橙子</label><br><input type="submit" value="提交">
</form></body>
</html>

定位input ,它们有共同的name:fruits

import os
from selenium import webdriver
from selenium.webdriver.common.by import By
# 访问本地html
driver = webdriver.Chrome()
file_path ='file:///'+ os.path.abspath('checkbox.html')
driver.get(file_path)
# 定位一组checkbox
checkboxs = driver.find_elements(By.XPATH, '//input[@name="fruits"]')
# 遍历一组元素,对每个元素进行点击
for checkbox in checkboxs:checkbox.click()

6、浏览器自带的元素辅助定位功能:

chrome、edage、firefox 浏览器支持选中元素右键–>检查–>在html源码页面选中元素–>右键–>复制–>

  • 复制xpath
  • 复制完整xpath
  • 复制selector

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com