Python+selenium 【第二章】UI自動化元素識別
UI自動化元素識別
- selenium常用api羅列
1.瀏覽器中載入URL:driver.get('http://wwwbaidu.com')
2.瀏覽器最大化:driver.maximize_window()
3.瀏覽器最小化:driver.minimize_window()
4.自定義瀏覽器視窗大小:driver.set_window_size(200,200)
5.重新整理:driver.refresh()
6.返回上一頁:driver.back()
7.向前進一頁:driver.forward()
8.截圖:driver.get_screenshot_as_file("c:\\test.bmp”)
9.獲取當前頁的URL:driver.current_url
10.獲取當前頁面的title:driver.title
11.獲取頁面原始碼:driver.page_source
12.關閉當前tab頁面:driver.close()
13.退出當前driver:driver.quit()
- 小試牛刀
demo_ui_02.py
# -*- coding: utf-8 -*- # @Time : 2021/12/10 10:50 # @Author : Limusen # @File : demo_ui_02 import os import time from selenium importwebdriver # 方法一 將驅動python的安裝路徑下 driver = webdriver.Chrome() driver.get("https://www.baidu.com") # 最小化 driver.minimize_window() time.sleep(1) # 最大化 driver.maximize_window() time.sleep(1) # 前進 driver.forward() # 後退 driver.back() # 重新整理 driver.refresh() # 截圖 driver.get_screenshot_as_file("file.png") time.sleep(1) # 關閉瀏覽器 driver.quit()
元素識別
元素的定位和操作是自動化測試的核心部分,其中操作又是建立在定位的基礎上的,舉例:一個物件就是一個人,我們可以通過身份證號、姓名或者他的住址找到這個人。那麼一個web物件也是一樣的,我們可以通過唯一區別於其它元素的屬性來定位這個元素。
元素識別:
1、利用Chrome瀏覽器開發者工具:
1)開啟Chrome瀏覽器,按F12或依次點選選單—更多工具—開發者工具;
2)切換到Elements頁籤,在Elements下點選左上方小箭頭可以指定頁面元素,檢視對應程式碼
2、利用火狐瀏覽器開發者工具:
1)開啟火狐瀏覽器,按F12或點選選單—web開發者—檢視器;
2)進入到檢視器頁籤,在檢視器下點選左上方小箭頭可以指定頁面元素,檢視對應程式碼
- 識別方法
1.通過id定位元素: driver.find_element_by_id("id_vaule")
2.通過name定位元素: driver.find_element_by_name("name_vaule")
3.通過class_name定位元素:driver.find_element_by_class_name("class_name")
4.通過tag_name定位元素:driver.find_element_by_tag_name("tag_name_vaule")
5.通過link定位:driver.find_element_by_link_text("text_vaule")或:driver.find_element_by_partial_link_text("text_vaule")
6.通過xpath定位元素:driver.find_element_by_xpath("xpath_syntax")
7.通過css定位元素driver.find_element_by_css_selector(“css_syntax”)
- 牛刀小試
# -*- coding: utf-8 -*- # @Time : 2021/12/10 11:06 # @Author : Limusen # @File : baidu_demo_01 """ 頁面元素均為百度 可自行查詢元素 """ import os import time from selenium import webdriver png_file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'sample', 'png_file', '{}') # 方法一 將驅動python的安裝路徑下 driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.implicitly_wait(10) # ===============通過id定位===============# # # 從上面截圖可以發現,這個元素有一個id屬性,我們可以通過id去定位這個屬性值 # # 然後進行操作 # driver.find_element_by_id("kw").send_keys("今天你吃飯了沒") # time.sleep(2) # driver.find_element_by_id("su").click() # time.sleep(2) # driver.get_screenshot_as_file(png_file_path.format("baidu_id.png")) # driver.quit() # ===============通過id定位===============# # ===============通過name-class定位===============# # driver.find_element_by_name("wd").send_keys("今天你吃飯了沒") # # 注意class一個屬性如果為空格 需要用.來進行拼接才能識別到 # driver.find_element_by_class_name("bg.s_btn").click() # ===============通過name定位===============# # ===============通過tag_name定位===============# # 用的比較少 # ===============通過tag_name定位===============# # ===============通過link_text定位===============# # driver.find_element_by_link_text("hao123").click() # driver.get_screenshot_as_file(png_file_path.format("baidu_demo_link_text.png")) # ===============通過link_text定位===============# # ===============通過xpath定位===============# # driver.find_element_by_xpath('//span/input[@id="kw"]').send_keys("今天吃飯了嗎") # driver.find_element_by_class_name("bg.s_btn").click() # ===============通過xpath定位===============# # ===============通過css定位===============# driver.find_element_by_css_selector('#kw').send_keys("今天吃飯了嗎") driver.find_element_by_class_name("bg.s_btn").click() # ===============通過css定位===============#
Xpath
後續主要用的是xpath我們現在講解一下xpath相關的知識
- XPATH是什麼?
- XPATH是一門在XML文件中查詢資訊的語言,XPATH可用來在XML文件中對元素和屬性進行遍歷,主流的瀏覽器都支援XPATH,因為HTML頁面在DOM中表示為XHTML文件。
- SeleniumWebDriver支援使用XPATH表示式來定位元素。
- Xpath常用六種定位方式:
- 絕對路徑
通過絕對路徑定位絕對路徑的開頭是一個斜線(/),從網頁的根節點html開始,逐層去查詢需要定位的元素。 此方法缺點顯而易見,當頁面元素位置發生改變時,都需要修改,因此,並不推薦使用。 舉例:百度搜索框絕對路徑定位driver.find_element_by_xpath('/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]/input')
備註:當同一層次有多個相同的元素時,使用下標區分,下標從1開始
- 相對路徑
通過相對路徑定位相對路徑的開頭是兩個斜線(//),表示檔案中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來。 舉例:百度搜索框相對路徑定位
driver.find_element_by_xpath('//span[1]/input')
driver.find_element_by_xpath(’//form/span[1]/input')
備註:以上都可以定位到百度搜索框,相對路徑的長度和開始位置並不受限制,可以採用從後往前逐層定位直到定位到即可的方式去定位。
- 元素索引
通過元素索引定位遇到同層級相同標籤元素時,可以使用索引(下標)表示,索引的初始值為1 舉例:定位百度hao123連結driver.find_element_by_xpath('//div[3]/a[2]')
- 元素屬性
使用元素屬性定位元素屬性定位要求屬效能夠定位到唯一一個元素,如果存在多個相同條件的標籤,預設定位第一個, 具體格式//標籤名[@屬性="屬性值"] 支援使用and和or關鍵字,多個屬性一起定位元素。
舉例: driver.find_element_by_xpath("//a[@name='tj_trnews']") driver.find_element_by_xpath("//a[@name='tj_trnews'and@class='mnav']") driver.find_element_by_xpath("//a[@name='tj_trnews’or@class='mnav']") 備註:Xpath支援萬用字元號*號,通過屬性定位還可以如下寫法: driver.find_element_by_xpath("//*[@*='tj_trnews']")
- 部分屬性值匹配
使用部分屬性值匹配(也稱為模糊方法定位)屬性值如果太長或網頁中的元素屬性動態變化,可以使用此方法元素屬性值開頭包含內容: starts-with()driver.find_element_by_xpath("//a[starts-with(@name,'tj_trhao')]") 元素屬性值結尾包含內容substring() driver.find_element_by_xpath("//a[substring(@name,9)='123']")元素屬性值結尾包含內容:contains() driver.find_element_by_xpath("//a[contains(@name,'hao')]")