「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
前言
selenium提供的定位方法有很多,先回顾一下
- 使用id定位
- 使用name定位
- 使用class name 定位
- 使用tag name 定位
- 使用链接文字定位
- 使用链接的部分文字定位
- 使用xpath定位
- 使用class定位
- 使用find_element("locator", "value"), 这个locator只支持id, name, xpath, css
- 使用find_elements_xxl来定位到组元素,再通过下标来找到想要定位的元素
selenium4 又新增了一个相对定位
selenium 相对定位
selenium4 新增了一个相对定位器,来帮助用户查找元素附近的其他元素。它提供的相对定位器有如下:
- above
- below
- toLeftOf
- toRightOf
- near 在selenium4中,find_element方法可以支持locator=withTagName, 它返回了一个关联定位器 我们通过例子来说明
我们有一个登陆页面,例如百度登陆页面
页面上有三个元素,用户名,密码输入框和一个登陆按钮
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
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")
执行结果,密码已经输入进去了
toLeftOf方法
这个也很好理解,就是找到定位到元素的左边的元素,我们换个页面,来看下百度这个主页面,上面有一排新闻 hao123, 地图,链接等tab ,我们先定位到图片tab, 再通过toLeftOf方法方法找到视频tab
上代码
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()
执行结果,看已经正确跳转到了视频页面,看到了俄罗斯和乌克兰的战争,敏感的战争政治话题就不讨论了
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()
执行结果
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")
执行结果
结语
相对定位其实是selenium4使用javascript的getBoundingClientRect方法来查找关联元素,这个方法会返回元素的属性,例如right,left,bottom,top。本文介绍的例子都相对简单,实际项目中元素定位往往很复杂,比如这个相对定位用的都是with_tag_name方法,如果这个tag,元素附近有很多相同的怎么办,它指定的是哪一个呢, 所以定位方法有多种多样,需要我们根据实际情况灵活应用。