使用By类,首先需要在Python中导入该模块:
from selenium.webdriver.common.by import By
1.通过元素的ID属性来定位
driver.find_element(By.ID,'kw')
如下图,我们需要定位百度的输入框。首先选中定位工具,然后选中输入框。我们可以看到该元素id的值为:"kw"
2.通过元素的NAME属性来定位
driver.find_element(By.NAME,'b2')
3.通过CLASS_NAME元素定位
driver.find_element(By.CLASS_NAME,'select-inner')
如下图,class的值为:"select-inner"
4.通过TAG_NAME元素定位
driver.find_element(By.TAG_NAME,'tag_name属性的值')
5.根据文本内容进行定位
driver.find_element(By.LINK_TEXT,'link_text属性的值')
这里既可以使用LINK_TEXT也可以使用PARTIAL_LINK_TEXT
a)使用LINK_TEXT,代码则是:
driver.find_element(By.LINK_TEXT, "selenium - 百度翻译")
b)使用PARTIAL_LINK_TEXT,代码书写如下:
driver.find_element(By.PARTIAL_LINK_TEXT, "selenium")
6.根据部分文本内容进行模糊匹配
driver.find_element(By.PARTIAl_LINK_TEXT,'partial_link_text属性的值'
7.通过CSS选择器定位元素
driver.find_element(By.CSS_SELECTOR, "span:contains('#main-outer > div > div > div.translate-wrap > div.trans-operation-wrapper > div.trans-operation.clearfix > a.language-btn.select-from-language > span > span")
如果是Chrome浏览器,可以直接右键选择复制selector。这里需要注意的是Safari浏览器不支持复制CSS元素
8.通过XPATH定位
driver.find_element(By.XPATH,'XPATH属性的值')
XPATH的使用比较的灵活,我先列举两种常规的
a)相对路径(推荐)
优点: 相对路径通常更短、更简洁,易于阅读和维护。它们以当前元素为起点,通过指定相对于当前元素位置的路径来定位其他元素
缺点:相对路径可能因为页面结构的改变而失效,尤其是在页面布局发生变化时。如果页面结构发生较大改动,相对路径可能需要进行调整
driver.find_element(By.XPATH, "//input[@class='bg s_btn']")
b)绝对路径
优点:绝对路径对于定位元素来说是最准确的,即使页面结构发生变化,它也可以始终准确定位到目标元素
缺点:绝对路径通常较长且较复杂,可读性较差。如果页面结构发生轻微变化(例如添加了一个新的父级元素),绝对路径可能需要进行相应的调整
driver.find_element(By.XPATH, "/html/body/div/div/div/div[2]/form/span/input")
总的来说,相对路径在大多数情况下是更好的选择,因为它们更简洁、易读,并且能够适应轻微的页面结构变化。但是,如果你需要更高的准确性和稳定性,或者页面结构变动较大,那么绝对路径可能更适合
相对路径拓展
定位一个属性
driver.find_element(By.XPATH,'//标签名[@属性名="属性的值"]')
定位多个属性
driver.find_element(By.XPATH,'//标签名[@属性名="属性的值" and @属性名="属性的值"]')
定位父子属性
driver.find_element(By.XPATH,'//标签名[@属性名="属性的值"]/下一级标签名/下一级标签名')
通过文本内容定位
driver.find_element_by_xpath('//标签名[contains(text(),"文本内容")]')