前言
selenium提供八种元素定位的方法:
find_element_by_id()
: 通过id定位。一个页面中的id是唯一的。有id的话尽量使用id定位。find_element_by_xpath()
: 通过xpath语法定位(常用)find_element_by_link_text()
: 通过链接文本定位find_element_by_partial_link_text()
: 通过部分链接文本定位find_element_by_name()
: 通过标签名称定位find_element_by_tag_name()
: 通过标签名称定位find_element_class_name()
: 通过class name定位find_element_by_css_selector()
: 通过css选择器(常用)
当前selenium版本(v4.1.5)更推荐使用find_element(by=By.xx, value="")的方式
通过ID定位元素
按照W3C的规范,元素的ID在页面上是唯一的,因此元素如有ID,通过ID去定位一般是最方便的,也是最快的。
但是,浏览器允许元素没有ID或者ID不唯一,所以还需要综合利用其它方法去定位元素。
- 示例
from selenium.webdriver.common.by import By # 点击id为123456的元素 driver.find_element(by=By.ID, value="123456").click()
通过name属性定位元素
元素的name属性是常用的一种定位锚点,但是需要注意,页面上name属性的值不一定是唯一的。
假设元素的网页源代码为:
<input name="next" type="submit" value="Login" />
定位方式:
from selenium.webdriver.common.by import By # 定位name属性为next的元素,然后输入123456 driver.find_element(by=By.NAME, value="next").send_keys("123456")
通过XPATH定位元素
xpath是xml页面中定位元素的一种方法,在html中也适用。通过xpath可以定位到绝大部分元素。xpath语法需要花大概十几分钟时间简单学习下。W3C School - xpath在线文档
假设元素的网页源代码为:
<input name="next" type="submit" value="Login" />
定位方式:
from selenium.webdriver.common.by import By # 通过相对路径定位属性namee为next、属性type为submit的input元素 # 然后输入123456 driver.find_element(by=By.XPATH, value="//input[@name='next' and @type='submit']").send_keys("123456")
xpath基本概念
- 父子节点
- 绝对路径和相对路径
- xpath方法:
contains()
text()
starts-with()
示例
from selenium.webdriver.common.by import By # 根据页面文字定位元素 driver.find_element(by=By.XPATH, value="//span[contains(text(), '资金业务系统')]").click()
通过css选择器定位元素
css选择器和xpath都可以定位复杂的页面元素,但是css选择器不依赖DOM。当页面集成了很多的CSS元素,CSS选择器的性能比xpath要更好。
# 基本语法 driver.find_element(by=By.CSS_SELECTOR, value='') # 定位标签为p,id为press的元素 # <p id="press"></p> value='p#press' ## 或者 value="p[id='press']" ## 或者 value="p#id='press'" # 定位标签为p,标签文本包含press的元素 # <p>press</p> value="p:contains('press')" # 定位多属性的元素 # <p class ="container" id="apress" style="align-self: center;"></p> value="[class='container'][id='apress'][style='align-self:center']" # 定位子元素 # <div id="cars"> # <a href="#aston_martin">Aston</a> # </div> value="div#cars a" # 多子元素中定位 # <ul id="cars"> # <li>Aston Martin</li> # <li>BMW</li> # <li>Chevy</li> # <li>Dodge</li> # </ul> # 定位第二个li value="ul#cars li:nth-of-type(2)" # 定位最后一个li value="ul#cars li:last-child"
通过锚标签定位元素
假设网页源代码为:
<a href="python.html">Python</a>
定位方法:
driver.find_element(by=By.LINK_TEXT, value="Python").click()
通过部分锚标签定位元素
driver.find_element(by=By.PARTIAL_LINK_TEXT, value="Pyt").click()
通过tag定位元素
假设需要定位网页标题
elem1 = driver.find_element(by=By.TAG_NAME, value="Title")
通过class名定位元素
假设元素的网页源代码为:
<p class="text-justify">Python with Selenium</p>
定位方式:
elem = driver.find_element(by=By.CLASS_NAME, value="text-justify")