selenium是一套比較火的開源自動化測試架構
selenium中元素定位有八種方式:
- id定位:
- class定位
- Name定位
- Tagname定位
- xpath定位
- css定位
- linkText定位
- partial_link定位
以上每種方式都有find_element()方法與之對應,下面代碼中有示例
下面以代碼執行個體展示,python版本為3.4.3,請求網頁為新浪财經網
(1)前期導入子產品
#coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait # 等待頁面加載某些元素
from selenium.webdriver.support import expected_conditions as EC # #該子產品包含一些判斷條件,比如用來判斷元素是否存在
from selenium.webdriver.common.by import By
from time import sleep
(2)定義url并擷取url内容
url = "http://finance.sina.com.cn/money/globalindex/" #新浪财經環球股指
browser = webdriver.Firefox()
browser.get(url)
(3)8種定位方式
1.id定位
print("id定位:擷取上證指數行情")
element = browser.find_element_by_id("hq_sh000001")
#element = browser.find_element("id", "hq_sh000001")
print(element.text)
結果為:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcdXWq1UMj1mYoxGWhxmWywEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYvwFd4VGdvwlMvw1ayFWbyVGdhd3PxQzM0gDMyEDNygDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2.class定位
print("class定位:擷取意見回報")
element = browser.find_element_by_class_name("text_info")
#element = browser.find_element("class name", "text_info")
print(element.text)
結果為:
3.name定位
print("name定位:擷取description中屬性為content的值")
element = browser.find_element_by_name("description")
#element = browser.find_element("name", "description")
print(element.get_attribute("content"))
結果為:
4.tagname定位
print("tagname定位:擷取标簽input中屬性為name的值")
element = browser.find_element_by_tag_name("input")
#element = browser.find_element("tag name", "input")
print(element.get_attribute("name"))
結果為:
5.xpath定位
print("xpath定位:擷取英國富時100指數最新價")
sleep(2) #等待一段時間,以防未加載完成,進而報錯
locator = (By.XPATH, "//*[@id="hq_b_UKX"]/ul/li[1]")
# WebDriverWait(driver, 逾時時長, 調用頻率, 忽略異常).until(可執行方法, 逾時時傳回的資訊)
#這裡逾時時長和sleep()等待時常不同,在逾時時間以内,隻要判斷資料已加載,便繼續進行下一步操作
element = WebDriverWait(browser, 5).until(EC.presence_of_element_located(locator)) # 顯式等待,等待的時間是固定的,這裡等待5s
#element = browser.find_element_by_xpath("/html/body/div[5]/div[5]/div[1]/div[1]/dl/dd[2]/div/ul/li[1]")
#element = browser.find_element("xpath", "/html/body/div[5]/div[5]/div[1]/div[1]/dl/dd[2]/div/ul/li[1]")
print(element.text)
結果為:
6.css定位
print("css定位:擷取英國富時100指數最新價")
element = browser.find_element_by_css_selector("#hq_b_UKX > ul:nth-child(1) > li:nth-child(1)")
#element = browser.find_element("css selector", "#hq_b_UKX > ul:nth-child(1) > li:nth-child(1)")
print(element.text)
結果為:
7.linkText定位
print("linkText定位:點選打開新浪首頁")
element = browser.find_element_by_link_text("新浪首頁")
#element = browser.find_element("link text", "新浪首頁")
element.click() #會點選進入新浪首頁
8.partial_link定位:同上,隻不過隻需要局部比對
print("partial_link定位:點選打開新浪首頁")
element = browser.find_element_by_partial_link_text("新浪首")
#element = browser.find_element("partial link text", "新浪首")
element.click() #會點選進入新浪首頁
(4)關閉并退出浏覽器
browser.close()
browser.quit()
總結:
1. 當頁面元素有id屬性時,最好盡量用id來定位。但由于現實項目中很多程式員其實寫的代碼并不規範,會缺少很多标準屬性,這時就隻有選擇其他定位方法。
2. xpath很強悍,但定位性能不是很好,是以還是盡量少用。如果确實少數元素不好定位,可以選擇xpath或cssSelector。
3. 當要定位一組元素相同元素時,可以考慮用tagName或name。
4. 當有連結需要定位時,可以考慮linkText或partialLinkText方式。