Selenium 的自動化原理:
selenium 自動化流程:
- 自動化程序調用Selenium 客戶端庫函數(比如點擊按鈕元素)
- 客戶端庫會發送Selenium 命令 給瀏覽器的驅動程序
- 瀏覽器驅動程序接收到命令后 ,驅動瀏覽器去執行命令
- 瀏覽器執行命令
- 瀏覽器驅動程序獲取命令執行的結果,返回給我們自動化程序
- 自動化程序對返回結果進行處理
google瀏覽器驅動:Chrome Driver
瀏覽器驅動更新,第三方庫 webdriver-manager
語句:ChromeDriverManager.install()
from selenium import webdriver
from selenium.webdriver.common.by import By? 升級到selenium4
wd = webdriver.Chrome()
輸入框輸入字符串使用 send_keys()
輸入之前使用element.clear() # 清除輸入框已有的字符串
點擊元素clik
根據class/ id/tag
wd.find_elements(By.CLASS_NAME, 'animal')
wd.find_element(By.ID, 'kw')
wd.find_elements(By.TAG_NAME, 'div')
獲取文本??element = wd.find_element(By.ID, 'animal')
? ? ? ? ? ? ? ? ?print(element.text)
獲取元素的屬性值 element.get_attribute('class')
關閉瀏覽器窗口?wd.quit()
獲取整個元素對應的HTML文本內容?element.get_attribute('outerHTML')
獲取某個元素內部的HTML文本內容?element.get_attribute('innerHTML')
獲取輸入框里的文字?element.get_attribute('value')
獲取文本顯示所有內容 element.get_attribute('textContent')
CSS
css selector? css 選擇器
1.tag名
elements = wd.find_elements(By.CSS_SELECTOR, 'div')??
2.id屬性值? ?#id值
element = wd.find_element(By.CSS_SELECTOR, '#searchtext')
3.class屬性值? ?.class值
elements = wd.find_elements(By.CSS_SELECTOR, '.animal')
4.直接子元素和后代元素? 后代元素包含直接子元素
? ?直接子元素中間沒有其他層
? ?直接子元素表示? 元素a > 元素b
? ?后代元素表示? ? ? 元素a? ? 元素b
5.其他屬性
? ?語法使用 [ ]
? ?例子:選擇屬性href值為 http://www.miitbeian.gov.cn 的元素
? ? ? ? ? ? ?element = wd.find_element(By.CSS_SELECTOR, '[href="http://www.miitbeian.gov.cn"]')
? ? ? ? ? ? a.不指定屬性值? [href]
? ? ? ? ? ? b.加上標簽名的限制?div[class='SKnet']?
? ?例子:href屬性包含了 miitbeian 字符串??[href*="miitbeian"]
? ? ? ? ? ? ??href屬性以 http 開頭?[href^="http"]
? ? ? ? ? ? ??href屬性以 gov.cn 結尾?[href$="gov.cn"]
?6.css選擇器可以 使用 逗號 ,稱之為 組選擇?
? ? 例子:同時選擇所有tag名為div的元素?和
?id為BYHY的元素??div,#BYHY
7.選擇的元素是父元素的第幾個子節點
? ?nth-child
? ?例子:第2個子元素,并且是span類型? span: nth-child(2)
??選擇的元素是父元素的倒數第幾個子節點
? nth-last-child
? 例子:選擇第倒數第1個子元素,并且是p元素 p:nth-last-child(1)
? 父元素的第幾個某類型的子節點
? ?nth-of-type
元素緊跟關系的是加號
h3 后面所有的兄弟節點 span??h3 ~ span
frame切換
wd.switch_to.frame(frame_reference)??frame_reference是name屬性值或者id
回原來的主html
wd.switch_to.default_content()
窗口的切換
切換到新窗口的操作
WebDriver對象有window_handles 屬性,這是一個列表對象, 里面包括了當前瀏覽器里面所有的窗口句柄。
for handle in wd.window_handles:
? ? # 先切換到該窗口
? ? wd.switch_to.window(handle)
? ? # 得到該窗口的標題欄字符串,判斷是不是我們要操作的那個窗口
? ? if 'Bing' in wd.title:
? ? ? ? # 如果是,那么這時候WebDriver對象就是對應的該該窗口,正好,跳出循環,
? ? ? ? break
wd.switch_to.window(handle)? ? --??handle 句柄對應網頁窗口的id
# mainWindow變量保存當前窗口的句柄
mainWindow = wd.current_window_handle
8.radio/checkbox框選擇選項,直接用WebElement的click方法
??element = wd.find_element(By.CSS_SELECTOR, '#s_radio input[name="teacher"]:checked')
??:checked 是CSS偽類選擇,表示選擇 checked 狀態的元素,對 radio 和 checkbox 類型的input有效
? select選擇框 selenium提供了一個select類
? ?select_by_value
? ?select_by_index
? ?去除選擇
? ?deselect_by_value
Xpath
根節點用/
相對路徑用// 從當前節點往下找
*
?是一個通配符
所有div節點的所有直接子節點??//div/*
Xpath 可以根據屬性來選擇元素
[@屬性名='屬性值']
style屬性值 包含 color 字符串的 頁面元素?//*[contains(@style,'color')]
選擇 style屬性值 以 color 字符串 開頭 的 頁面元素//*[starts-with(@style,'color')]
?p類型第2個的子元素? p[2]
?選取p類型倒數第1個子元素 p[last()]
Xpath用豎線表示多個組合選擇
元素的父節點用 /..
xpath也可以選擇 后續 兄弟節點,用這樣的語法 following-sibling::
xpath還可以選擇 前面的 兄弟節點,用這樣的語法 preceding-sibling::
Selenium常用的等待包括顯式等待、隱式等待、強制等待
隱式等待:是整個頁面的等待。設置一個最長的等待時間,在規定時間內整個頁面加載完成,則執行下一步,否則繼續等待直到最長等待時間結束
? ? ? ? ? ? ? ? implicitly_wait(時間)
顯式等待:是針對某個元素的等待。在設置時間內,默認每隔一段時間檢測一次當前頁面某個元素是否存在
? ? ? ? ? ? ? WebDriverWait 類,與until() 和until_not() 結合
強制等待:time.sleep()
appium
appium 測試移動端應用? appium 繼承了webdriver
selenium?測試Web應用
鏈接地址:www.byhy.net