自動化測試selenium

2021-12-31 12:00:02


一、測試是否可以正常執行

1、簡單測試

  • 新建一個專案。
    在這裡插入圖片描述
  • 建立一個python包。
    在這裡插入圖片描述- 新建一個py檔案。
  • 首先輸入from selenium 等待下載selenium,如果不下載,就會出現selenium下有紅線的現象。
# 導包
from selenium import webdriver
import time

# 獲取 Chrome 瀏覽器的驅動
driver = webdriver.Chrome()
# 在 Chrome 瀏覽器中開啟百度頁面
driver.get("https://www.baidu.com/")
# 瀏覽器最大化
driver.maximize_window()
# 定位百度搜尋輸入框,然後輸入想要查詢的資訊
driver.find_element_by_css_selector("#kw").send_keys("我在他鄉挺好的")
# 定位搜尋按鈕,然後點選
driver.find_element_by_css_selector("#su").click()

# 頁面等待時間 8s
time.sleep(8)
# 關閉瀏覽器
driver.quit()
  • 選擇快鍵鍵 ctrl + shift + f10 就會執行。

二、元素定位

  • 要想操作一個物件,首先應該識別這個物件。
  • 定位方式有很多,但是要保證這種方式存在,且能夠唯一的定位到這個元素。

1、用 id 來定位 優先選擇 ※

  • 首先在 Chrome 瀏覽器上把滑鼠放到搜尋方塊,滑鼠右擊選擇開發者模式(快捷鍵:f12),檢視對應 id 名。
    在這裡插入圖片描述
    在這裡插入圖片描述
driver.find_element_by_id("kw").send_keys("肖戰")
driver.find_element_by_id("su").click()

2、用 name 來定位

  • 在開發者模式中找到對應的name,
    在這裡插入圖片描述
driver.find_element_by_name("wd").send_keys("肖戰演員")
driver.find_element_by_id("su").click()

3、用 class name 來定位

  • class name不唯一,容易出錯。
    在這裡插入圖片描述
driver.find_element_by_class_name("s_ipt").send_keys("xiaozhan")
driver.find_element_by_class_name("bg s_btn").click()

4、用 link text (連結)定位

  • 有時候不是一個輸入框也不是一個按鈕,而是一個文字連結,我們可以通過link。
    在這裡插入圖片描述
driver.find_element_by_link_text("hao123").click()

5、用 partial link text (連結文字)定位

  • 通過部分連結定位,可以只用連結的一部分文字進行匹配。
driver.find_element_by_partial_link_text("新").click()

6、用 tag name (標籤)定位

在這裡插入圖片描述

driver.find_element_by_tag_name("input").send_keys("陳情令")
driver.find_element_by_tag_name("input").click()
  • 失敗,ElementNotInteractableException: element not interactable 無法互動。input 標籤元素太多,無法定位。

7、用 XPath 定位 ※

  • XPath 是一種在XML 檔案中定位元素的語言。因為HTML 可以看做XML 的一種實現,所以selenium 使用者可是使用這種強大語言在web 應用中定位元素。
  • 用 id 來定位 優先選擇。如果沒有,使用 xpath 也可以唯一定位。
  • 熟悉前端頁面也可以自己寫 :// 路徑, * 所有的尋找, @id 尋找 id。
    在這裡插入圖片描述
# 在貼上中,注意「 」 內是' ' ,需要修改
driver.find_element_by_xpath("//*[@id='kw']").send_keys("陳情令")
driver.find_element_by_xpath("//*[@id='su']").click()

8、用 css selector 定位

  • 當有唯一 id 用 # ,有唯一 class 用 . 。
driver.find_element_by_css_selector("#kw").send_keys("cql")
driver.find_element_by_css_selector("#su").click()

整體程式碼

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 瀏覽器最大化
driver.maximize_window()
# 用 id 來定位 優先選擇  如果沒有,使用 xpath 也可以唯一定位
# driver.find_element_by_id("kw").send_keys("肖戰")
# driver.find_element_by_id("su").click()

# 用 name 來定位
# driver.find_element_by_name("wd").send_keys("肖戰演員")
# driver.find_element_by_id("su").click()

# 用 class name 來定位  不唯一,出錯
# driver.find_element_by_class_name("s_ipt").send_keys("xiaozhan")
# driver.find_element_by_class_name("bg s_btn").click()

# link text
# driver.find_element_by_link_text("hao123").click()

# 連結的文字內容 partial link text
# driver.find_element_by_partial_link_text("新").click()

# tag name  標籤 ElementNotInteractableException: element not interactable 無法互動 input標籤元素太多,無法定位
# driver.find_element_by_tag_name("input").send_keys("陳情令")
# driver.find_element_by_tag_name("input").click()

# xPath //路徑   *所有的尋找   @id尋找id
# driver.find_element_by_xpath("//*[@id='kw']").send_keys("陳情令")
# driver.find_element_by_xpath("//*[@id='su']").click()

# css  id用#號  如果有唯一class是.號
driver.find_element_by_css_selector("#kw").send_keys("cql")
driver.find_element_by_css_selector("#su").click()

time.sleep(6)
driver.quit()

三、操作測試物件

1、click 點選物件

  • click() 用於點選一個按鈕。

2、send_keys 在物件上模擬按鍵輸入

  • send_keys(「xx」) 用於在一個輸入框裡輸入xx 內容。

3、clear 清除物件的內容(如果可以的話)

  • clear() 用於清除輸入框的內容。
  • 比如百度輸入框裡預設有個「請輸入關鍵字」的資訊。
  • 比如我們的登陸框一般預設會有「賬號」「密碼」這樣的預設資訊,clear 可以幫助我們清除這些資訊。
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
driver.find_element_by_css_selector("#kw").send_keys("我在他鄉挺好的")
driver.find_element_by_css_selector("#su").click()
time.sleep(6)

# 清除資訊  先定位
driver.find_element_by_id("kw").clear()
time.sleep(5)

# 在搜尋其他資訊
driver.find_element_by_id("kw").send_keys("肖戰")
driver.find_element_by_id("su").click()
time.sleep(6)

driver.quit()

4、submit 提交表單

  • 把「百度一下」的操作從click 換成submit 可以達到相同的效果(在該頁面唯一,與 click 作用一致)。
driver.find_element_by_id("kw").send_keys("肖戰")
driver.find_element_by_id("su").submit()

5、text 用於獲取元素的文字資訊

  • text 用於獲取元素的文字資訊。
    在這裡插入圖片描述
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()

# 獲取元素內容
text = driver.find_element_by_id("bottom_layer").text
print(text)

driver.quit()

在這裡插入圖片描述

四、新增等待

  • 新增休眠非常簡單,我們需要引入time 包,就可以在指令碼中自由的新增休眠時間。
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()

driver.find_element_by_id("kw").send_keys("肖戰")
driver.find_element_by_id("su").click()

# 找到肖戰,跳轉到肖戰的百度百科介面
driver.find_element_by_link_text("百度百科").click()
# 沒有找到,在資源沒載入出來,就去尋找資源,導致沒有變化

time.sleep(6)
# close 關閉瀏覽器   quit 不僅關閉瀏覽器,還可以清除快取垃圾
driver.quit()

所以在這時就需要新增一個等待。

1、固定等待 time.sleep()

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()

driver.find_element_by_id("kw").send_keys("肖戰")
driver.find_element_by_id("su").click()

# 加一個等待
# 固定等待,讓頁面 等待 規定的時間 10s ,在 10s後在查詢肖戰的百度百科,
time.sleep(10)

driver.find_element_by_link_text("百度百科").click()

time.sleep(6)
driver.quit()

2、智慧等待 implicitly_wait()

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()

driver.find_element_by_id("kw").send_keys("肖戰")
driver.find_element_by_id("su").click()

# 加一個等待
# 智慧等待 ,當頁面載入出來後就直接跳轉, 下面的意思是最多等10秒  但是在10s後沒有載入出來後就會報錯
driver.implicitly_wait(10)

driver.find_element_by_link_text("百度百科").click()

time.sleep(6)
driver.quit()