1. 程式人生 > 其它 >Python之Selenium

Python之Selenium

一、Selenium

Selenium是非常優秀的WEB(UI)自動化測試框架,最小的版本是Selenium4.x。Selenium支援主流的瀏覽器自動化測試,具體是Chrome,IE,Firefox等瀏覽器,Selenium也是支援主流的開發語言,如Python,Java,Net,PHP

Selenium=WebDriver+Selenium

二、環境搭建

1、安裝Selenium的庫,pip3 install selenium

2、安裝Chrome瀏覽器

3、安裝Chrome瀏覽器的驅動

        A、檢視Chrome瀏覽器版本

        B、到淘寶源下載與瀏覽器版本匹配的Driver

        C、下載成功後進行解壓,並且以管理員身份執行

        B、把這個driver放到Python的安裝目錄下

三、元素定位

webdriver之所以能夠操作瀏覽器,是因為它首先需要定位到被操作的元素屬性,然後就可以對瀏覽器做各種操作

1、單個元素定位

2、多個元素定位,指的是元素的屬性都一致,返回的時列表,可以根據列表的索引來定位元素屬性

3、不管是單個元素定位還是多個元素定位,目前有8種,分別為:

      ID = "id" #ID不能是唯一的

      NAME = "name"

      CLASS_NAME = "class name"

      XPATH = "xpath"

      LINK_TEXT = "link text" #超連結

      PARTIAL_LINK_TEXT = "partial link text" #也是處理超連結,但是為模糊搜尋

      TAG_NAME = "tag name"

      CSS_SELECTOR = "css selector"

簡易操作步驟舉例:

from selenium import webdriver   #從selenium中匯入webdriver。
import time   #匯入時間的庫
driver=webdriver.Chrome()    #對Chrome進行例項化處理
driver.
get("http://www.baidu.com") #導航到百度 time.sleep(4) #休眠4s driver.quit() #退出瀏覽器

 

 

1、ID = "id" #ID不能是唯一的

from selenium import  webdriver
import  time

# id元素屬性
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")

# send_keys()——輸入的意思
driver.find_element_by_id("kw").send_keys("美食 圖片")
time.sleep(5)
driver.quit()

2、NAME = "name"

# name的元素屬性
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")

driver.find_element_by_name("wd").send_keys("美食 圖片")
time.sleep(5)
driver.quit()

3、CLASS_NAME = "class name"

查詢class後的內容

# class_name元素屬性
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")

driver.find_element_by_class_name("s_ipt").send_keys("美食 圖片")
time.sleep(4)
driver.quit()

4、XPATH = "xpath"

xpath和full xpath區別

當ID為動態引數時,因為每次返回的值不同建議使用full xpath全路徑

當使用id,name,class_name都定位不到時,就需要考慮使用css或xpath

 

使用xpath資訊時,需要點選input前的三個點,左鍵選擇copy,可以切換xpath,full xpath和selector

# xpath元素屬性

from selenium import  webdriver
import time
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_xpath('//*[@id="kw"]').send_keys('美食 圖片')
time.sleep(3)
driver.quit()
 
# full xpath元素屬性

driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input').send_keys('美食 圖片')

5、CSS_SELECTOR = "css selector"

css和xpath區別

         css選擇是依據頁面的資料樣式定位的,有標籤選擇,類選擇,id選擇,,或者他們的交併

集, 除此之外沒有其他的輔助元素了

          xpath 是路徑表示式,所有元素和內容都可以成為路徑的一部分。

兩種定位方式功能基本一致,但是xpath明顯更強大,只是xpath寫起來較複雜,css寫起來容易些

# css元素屬性
driver=webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_css_selector('#kw').send_keys("美食 圖片") time.sleep(3) driver.quit()

 

6、LINK_TEXT = "link text" #超連結

PARTIAL_LINK_TEXT = "partial link text" #也是處理超連結,但是為模糊搜尋

from selenium import  webdriver
import  time

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

# click()——點選的意思
# 超連結
driver.find_element_by_link_text('新聞').click()

#partial link text
driver.find_element_by_partial_link_text('').click()
time.sleep(3)
driver.quit()

7、TAG_NAME = "tag name"

# tagName元素屬性

driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
# tags=driver.find_element_by_tag_name("input").send_keys("美食 圖片")
tags=driver.find_elements_by_tag_name("input")
# print(type(tags))
# for item in tags:
#  print(item)
tags[7].send_keys("美食 圖片")
time.sleep(8)
driver.quit()

實戰

from selenium import webdriver
import time

#以新浪郵箱登入為例,通過id元素屬性定位:

driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")
driver.find_element_by_id("freename").send_keys("9615")
driver.find_element_by_id("freepassword").send_keys("123456")
time.sleep(3)
driver.find_element_by_link_text("登入").click() 
time.sleep(
3)
driver.quit()

 

四、UI自動化常用操作

1、獲取當前測試地址

assert:是Python原生的斷言方法

如:a==1,b==1,c==2

那麼assert a=b,而assert a=c會出現asserterror錯誤

from selenium import webdriver
import time
#獲取當前測試地址:
driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")

#current_url獲取當前被測試WEB的地址
print(driver.current_url)

#assert:是python原生的斷言方法。
assert driver.current_url.endswith("sina.com.cn/")
time.sleep(3)
driver.quit()

 

2、獲取當前頁面程式碼

from selenium import webdriver
import time

#獲取當前頁面地址
driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")

#page_source:獲取當前頁面的程式碼
print(driver.page_source)
driver.quit()

 

3、獲取當前測試WEB的title

from selenium import webdriver
import time

#獲取WEB的title
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.title
print(driver.title)
assert driver.title=="百度一下,你就知道"
driver.quit()

4、頁面的前進與後退

from selenium import webdriver
import time

#頁面的前進與後退
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
print(driver.current_url)
time.sleep(2)
driver.get("https://mail.sina.com.cn/")
print(driver.current_url)
time.sleep(2)

#頁面後退
driver.back()
print(driver.current_url)
time.sleep(2)

#頁面前進
driver.forward()
print(driver.current_url)
time.sleep(2)
driver.title
print(driver.title)
driver.quit()

5、多視窗解決思路

解決步驟:

 5.1、先開啟當前頁面

 5.2、獲取當前頁面放在一個變數中

 5.3、開啟新的頁面

 5.4、獲取所有頁面並放在一個變數中

 5.5、迴圈所有頁面,判斷出:如果不是當前頁面,就是在新的頁面

from selenium import webdriver
import time

driver=webdriver.Chrome()
driver.get("https://mail.sina.com.cn/")

#瀏覽器頁面最大化
driver.maximize_window()

# 獲取當前頁面放在一個變數中
# current_window_handle:獲取當前頁面
nowHandle=driver.current_window_handle
time.sleep(3)

#開啟新的頁面
driver.find_element_by_link_text("註冊").click()
time.sleep(2)

#獲取所有頁面並且放在一個變數中
# window_handles:獲取所有頁面
allHandle=driver.window_handles
time.sleep(1)

#迴圈所有頁面
for handle in allHandle:

#判斷如果不是當前頁面,那麼就是在新的頁面。
    if handle!=nowHandle:

#從當前頁面切換到新的頁面
        driver.switch_to.window(handle)
        driver.find_element_by_name("email").send_keys("asd123")
        time.sleep(2)

#關閉新的頁面,但是不關閉程式。
        driver.close()

#從新的頁面切換到原來的頁面
driver.switch_to.window(nowHandle)
time.sleep(1)
driver.find_element_by_id("freename").send_keys("qy12345")
time.sleep(2)
driver.quit()

6、清空——clear()

from selenium import webdriver
import time

#clear():清空
driver=webdriver.Chrome()
driver.get("http://www.baidu.com")
so=driver.find_element_by_id("kw")
so.send_keys("美食")
time.sleep(2)
so.clear()
time.sleep(2)
driver.quit()

7、獲取元素屬性的值

from selenium import webdriver
import time

#get_attribute()的方法是獲取元素屬性的值
driver=webdriver.Chrome()
driver.maximize_window()
driver.get("http://www.baidu.com")
time.sleep(2)
so=driver.find_element_by_id("kw")
time.sleep(1)
so.send_keys("美食")

#我們在輸入框中輸入的值都是鍵值中的value。
print(so.get_attribute("value"))
time.sleep(3)
driver.quit()