前言:
我們在做WEB自動化時,最根本的就是操作頁面上的元素,首先我們要能找到這些元素,然后才能操作這些元素。工具或代碼無法像我們測試人員一樣用肉眼來分辨頁面上的元素。那么我們怎么來定位他們呢?
在學習元素定位之前,我們最好能懂一點html的知識。
一、查看頁面元素
用谷歌瀏覽器打開百度首頁,按F12,就可以看到整個頁面的html代碼了
二、元素定位
- id定位: find_element_by_id()
from selenium import webdriver
from time import sleep
drive = webdriver.Chrome()
drive.get('http://www.baidu.com')
sleep(3)
drive.find_element_by_id("kw").send_keys("selenium python") # 通過 id 定位到搜索框,發送值 selenium python,find_element_by_id 查找元素通過 id
sleep(3)
drive.find_element_by_id("su").click() # 通過 id 定位到搜索按鈕,點擊
sleep(3)
drive.quit()
- name定位:find_element_by_name()
from selenium import webdriver
from time import sleep
drive = webdriver.Chrome()
drive.get('http://www.baidu.com')
sleep(3)
drive.find_element_by_name("wd").send_keys("selenium python") # 通過 id 定位到搜索框,發送值 selenium python,find_element_by_id 查找元素通過 id
sleep(3)
drive.find_element_by_id("su").click() # 通過 id 定位到搜索按鈕,點擊
sleep(3)
drive.quit()
- tag定位:find_element_by_tag_name() ---下面代碼僅做參考,運行時必定報錯
from selenium import webdriver
from time import sleep
drive = webdriver.Chrome()
drive.get('http://www.baidu.com')
sleep(3)
drive.find_element_by_tag_name("input").send_keys("selenium python") # 通過 id 定位到搜索框,發送值 selenium python,find_element_by_id 查找元素通過 id
sleep(3)
drive.find_element_by_id("su").click() # 通過 id 定位到搜索按鈕,點擊
sleep(3)
drive.quit()
- link定位:find_element_by_link_text()
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_link_text('新聞').click()
sleep(3)
driver.quit()
- partial_link定位:find_element_by_partial_link_text()
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_partial_link_text('聞').click()
sleep(3)
driver.quit()
- class_name定位:find_element_by_class_name()
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_class_name("s_ipt").click()
sleep(3)
driver.quit()
- CSS定位:find_element_by_css_selector()
Selenium 推薦使用 css 定位,而不是 xpath 來定位元素,原因是 css 定位比 xpath 定位速度快,語法也更加簡潔
Css 常用方法定位
(1) find_element_by_css_selector()
(2) #id id 選擇器根據 id 屬性來定位元素
(3) .class class 選擇器,根據 class 屬性值來定位元素
(4) [attribute=’value’] 根據屬性來定位元素
(5) element>element 根據元素層級來定位 父元素>子元素
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_css_selector('#kw').click()
sleep(3)
driver.quit()
css相對路徑定位:
driver.find_element_by_css_selector("input[value='查詢']")
- xpath定位:find_element_by_xpath
1.標簽+屬性定位——xpath = "//標簽名[@屬性='屬性值']"
例如,百度首頁的輸入框的xpath就可以表示為//[@id="kw"],其中表示所有的標簽名
當單一的屬性無法確定到一個元素時,可以使用組合屬性的方式
例如,百度首頁的輸入框可以表示為//*[@id="kw" and @name="wd"]
當然,也可以使用其他的邏輯運算,比如or、not
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_xpath('//*[@id="kw"]').click()
sleep(3)
driver.quit()
2.text()方法定位
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_xpath("//*[text()='新聞']").click()
sleep(3)
driver.quit()
3.contains()方法定位,也叫模糊定位
xpath = "//標簽名[contains(@屬性, '屬性值')]"
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_xpath("//a[contains(@name,'news')]").click()
sleep(3)
driver.quit()
4.starts-with ,ends-with方法定位
starts-with -- 匹配以xx開頭的屬性值;ends-with -- 匹配以xx結尾的屬性值
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_xpath("//*[starts-with(@value,'百度一')]").click()
sleep(3)
driver.quit()
5.如果一個元素無法通過自身的屬性定位到,那么可以先定位到他的上一級或者上N級,然后再一級一級地找到他
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
driver.maximize_window()
driver.find_element_by_xpath("//form[@id='form']/span[contains(@class,'s_ipt_wr')]/input").send_keys("selenium")
sleep(3)
driver.quit()