前言

selenium提供的定位方法有很多,先回顾一下

  1. 使用id定位
  2. 使用name定位
  3. 使用class name 定位
  4. 使用tag name 定位
  5. 使用链接文字定位
  6. 使用链接的部分文字定位
  7. 使用xpath定位
  8. 使用class定位
  9. 使用find_element("locator", "value"), 这个locator只支持id, name, xpath, css
  10. 使用find_elements_xxl来定位到组元素,再通过下标来找到想要定位的元素

selenium4 又新增了一个相对定位

selenium 相对定位

selenium4 新增了一个相对定位器,来帮助用户查找元素附近的其他元素。它提供的相对定位器有如下:

  • above
  • below
  • toLeftOf
  • toRightOf
  • near

在selenium4中,find_element方法可以支持locator=withTagName, 它返回了一个关联定位器 我们通过例子来说明

我们有一个登陆页面,例如百度登陆页面

selenium相对定位器_相对定位

页面上有三个元素,用户名,密码输入框和一个登陆按钮

above方法

该方法用来返回指定元素上方的元素。例如我们可以先定位到密码输入框, 直接上代码

from selenium.webdriver.support.relative_locator import with_tag_name
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://passport.baidu.com/v2/?login&u=https%3A%2F%2Fwww.baidu.com%2Fmy%2Findex")
time.sleep(2)
#TANGRAM__PSP_3__footerULoginBtn
driver.find_element_by_id("TANGRAM__PSP_3__footerULoginBtn").click()
time.sleep(2)
password = driver.find_element(By.ID, "TANGRAM__PSP_3__password") #TANGRAM__PSP_3__password
email_address = driver.find_element(with_tag_name("input").above(password))
email_address.send_keys("hong mao dan")

time.sleep(120)

执行结果,用户名输入框正确输入了hong mao dan

selenium相对定位器_chrome_02

below方法

顾名思义,就是查找定位元素下方的元素,那我们可以反推,先定位到用户名输入框,再通过below方法找到密码输入框 还是上代码

email_input = driver.find_element(By.ID, "TANGRAM__PSP_3__userName")
password_input = driver.find_element(with_tag_name("input").below(email_input))
password_input.send_keys("it's a secret")

执行结果,密码已经输入进去了

selenium相对定位器_ide_03

toLeftOf方法

这个也很好理解,就是找到定位到元素的左边的元素,我们换个页面,来看下百度这个主页面,上面有一排新闻 hao123, 地图,链接等tab ,我们先定位到图片tab, 再通过toLeftOf方法方法找到视频tab

selenium相对定位器_ide_04

上代码

driver.get("https://www.baidu.com/")
image_tab = driver.find_element(By.PARTIAL_LINK_TEXT, "图片")
video_tab = driver.find_element(with_tag_name("a").to_left_of(image_tab))
video_tab.click()

执行结果,看已经正确跳转到了视频页面,看到了俄罗斯和乌克兰的战争,敏感的战争政治话题就不讨论了

selenium相对定位器_Python_05

toRightOf方法

左边完事了,那就看右边的,所以我们翻过来,找到视频链接的元素,再根据right方法去找图片tab 上代码

video_tab = driver.find_element(By.PARTIAL_LINK_TEXT, "视频")
image_tab = driver.find_element(with_tag_name("a").to_right_of(video_tab))
image_tab.click()

执行结果

selenium相对定位器_ide_06

near方法

那最后再看看near方法

该方法用来返回指定元素附近的元素,最远的距离是50像素

那我们根据图片链接元素,看能不能定位到百度输入框 上代码

video_tab = driver.find_element(By.PARTIAL_LINK_TEXT, "视频")
# image_tab = driver.find_element(with_tag_name("a").to_right_of(video_tab))
# image_tab.click()
baidu_input = driver.find_element(with_tag_name("input").to_right_of(video_tab))
baidu_input.send_keys("hello world")

执行结果

selenium相对定位器_chrome_07

结语

相对定位其实是selenium4使用javascript的getBoundingClientRect方法来查找关联元素,这个方法会返回元素的属性,例如right,left,bottom,top。本文介绍的例子都相对简单,实际项目中元素定位往往很复杂,比如这个相对定位用的都是with_tag_name方法,如果这个tag,元素附近有很多相同的怎么办,它指定的是哪一个呢, 所以定位方法有多种多样,需要我们根据实际情况灵活应用。