前言
?? Python Selenium是Selenium WebDriver的Python語言封裝,為Python開發(fā)者提供了一個方便易用的自動化測試庫。它支持多種瀏覽器(如Chrome、Firefox、Edge等)以及多個操作系統(tǒng),可以模擬用戶在瀏覽器中的各種行為,包括打開網(wǎng)頁、查找元素、輸入文本、點擊鏈接、提交表單、上傳文件等。
- Python+Selenium 來實現(xiàn)的web端自動化, 以下演示會用到禪道、百度、京東和自己編寫的html.
一、準備工作
1、安裝
- 安裝Python 3
- 安裝selenium庫,命令:pip install selenium
- 搭建禪道環(huán)境
2、導入瀏覽器驅(qū)動
selenium操作不同的瀏覽器,需要下載不同瀏覽器的驅(qū)動
- Firefox 瀏覽器驅(qū)動: 瀏覽器驅(qū)動下載 webdriver.Firefox()
- Chrome瀏覽器驅(qū)動:瀏覽器驅(qū)動下載 webdriver.Chrome()
- IE瀏覽器驅(qū)動:瀏覽器驅(qū)動下載 webdriver.Ie()
- Edge瀏覽器驅(qū)動:瀏覽器驅(qū)動下載 webdriver.Edge()
以chrome瀏覽器為例:
1、進入到下載頁面,找到符合自己瀏覽器版本的驅(qū)動
2、下載好了之后,右鍵解壓到當前文件夾
3、將得到的chromedriver.exe放到Python的安裝目錄
二、使用方法
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
class SampleTutorial:
def __init__(self):
# 創(chuàng)建了一個Chrome瀏覽器的WebDriver實例
self.driver = webdriver.Chrome()
# ChromeOptions類提供了對Chrome瀏覽器各種選項進行配置的方法;
# 在excludeSwitches參數(shù)中,將enable-logging指定為要排除的選項,表示不啟用瀏覽器的日志功能
# options = webdriver.ChromeOptions()
# options.add_experimental_option('excludeSwitches', ['enable-logging'])
# self.drive = webdriver.Chrome(options=options)
# 最大化窗口
self.driver.maximize_window()
# 隱式等待,設置最大的等待時長,只對查找元素(find_elementXXX)生效
self.driver.implicitly_wait(2)
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
def sign_out(self):
"""退出瀏覽器"""
# 關閉當前瀏覽器窗口或標簽頁。如果只有一個窗口或標簽頁被打開,調(diào)用driver.close()將會關閉整個瀏覽器會話。
# 如果有多個窗口或標簽頁存在,調(diào)用driver.close()將關閉當前活動窗口或標簽頁,并切換到上一個窗口或標簽頁。
self.driver.close()
# 關閉瀏覽器,調(diào)用driver.quit()會終止WebDriver對象的相關進程和資源,及時清理測試環(huán)境。
self.driver.quit()
if __name__ == "__main__":
run = SampleTutorial()
run.method()
# 當自動化測試腳本執(zhí)行完畢后,WebDriver對象會自動關閉相關的瀏覽器進程,釋放資源并終止與瀏覽器的會話。
# 但是,有時候在測試過程中,腳本出現(xiàn)異常導致未關閉瀏覽器,這時我們就需要手動調(diào)用來關閉瀏覽器。
# run.sign_out()
1、元素定位方法
-
禪道登陸演示
- 單屬性查找
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
# 1.用 id 屬性定位查找
self.driver.find_element(By.ID, "account")
# 2.用 name 屬性定位查找
self.driver.find_element(By.NAME, "account")
# 3.用 class 屬性定位查找
self.driver.find_element(By.CLASS_NAME, "form-control")
# 4.用 xpath 屬性定位查找
self.driver.find_element(By.XPATH, '//*[@id="account"]')
# 5.具有給定標簽名稱的第一個元素將被返回
self.driver.find_element(By.TAG_NAME, "input")
# 6.用 css 屬性定位查找
# 方法一[標簽名]
self.driver.find_element(By.CSS_SELECTOR, 'input')
# 方法二[id], #代表id
self.driver.find_element(By.CSS_SELECTOR, '#account')
# 方法三[class], .代表class
self.driver.find_element(By.CSS_SELECTOR, '.form-control')
# 方法四[其他屬性]
self.driver.find_element(By.CSS_SELECTOR, '[name="account"]')
# 7.鏈接文本值與位置匹配的第一個元素將被返回
# (通過標簽對之間的文本進行定位)
self.driver.find_element(By.LINK_TEXT, "忘記密碼")
# 8.具有部分鏈接文本值與位置匹配的第一個元素將被返回
# (partial link其實是對link的一個擴展,因為有些時候鏈接文本很長,這時候就可以使用其中的一部分來進行定位)
self.driver.find_element(By.PARTIAL_LINK_TEXT, "忘記")
- 組合屬性查詢
def method(self):
"""代碼執(zhí)行"""
# 1.通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
# 2.標簽名和id屬性值組合定位
self.driver.find_element(By.CSS_SELECTOR, 'input#account')
# 3.標簽名和class屬性值組合定位
self.driver.find_element(By.CSS_SELECTOR, 'input.form-control')
# 4.標簽名和屬性(含屬性值)組合定位
self.driver.find_element(By.CSS_SELECTOR, 'input[name="account"]')
# 5.多個屬性組合定位
self.driver.find_element(By.CSS_SELECTOR, '[class="form-control"][name="account"]')
-
層級查詢
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
# 1.查詢元素時,我們也可以先查詢父級,然后再查詢子級,父級和子級用空格隔開,如上圖所示(div - table - input)
self.driver.find_element(By.CSS_SELECTOR, '.col-8 [class="table table-form"] #account')
-
相同元素定位
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
# 定位第一個元素
self.driver.find_element(By.CSS_SELECTOR, '[class="form-control"]')
# 定位第二個元素,find_elements后面加了s
self.driver.find_elements(By.CSS_SELECTOR, '[class="form-control"]')[1]
- 我們在進行元素定位時,獲取到的元素一定是唯一的或第一個。查看是否唯一我們可以按CTRL+F搜索,如下:
2、輸入、清空、點擊操作
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
# 輸入:send_keys()
self.driver.find_element(By.CSS_SELECTOR, '#account').send_keys("admin")
# 清空: clear()
self.driver.find_element(By.CSS_SELECTOR, '#account').clear()
# 單機操作(相當于鼠標點擊):click()
self.driver.find_element(By.CSS_SELECTOR, '.form-actions #submit').click()
3、回車鍵操作
# 點擊登錄按鈕,一般情況下,使用click()進行點擊
# 有些時候也可以使用submit()代替click(),相當于敲回車
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('https://www.baidu.com/')
# 輸入內(nèi)容,點擊百度一下
self.driver.find_element(By.CSS_SELECTOR, '[class="s_ipt"]').send_keys("軟件測試")
# 回車操作(相當于按回車鍵):submit()
self.driver.find_element(By.CSS_SELECTOR, '[id="su"]').submit()
4、獲取元素內(nèi)容
- Text獲取元素內(nèi)容
# text 獲取元素內(nèi)容
text = self.driver.find_element(By.CSS_SELECTOR, '.form-actions a').text
print(text)
# 結果:忘記密碼
- 如果使用Text獲取元素內(nèi)容時,返回的是空值,但未報錯,這個時候我們需要使用get_attribute(‘innerText’)獲取元素的內(nèi)容
# 獲取元素內(nèi)容
get = self.driver.find_element(By.CSS_SELECTOR, '#loginPanel h2').get_attribute('innerText')
print(get)
# 結果:易軟天創(chuàng)項目管理系統(tǒng)
5、獲取元素屬性的值
- 禪道登陸演示
# 獲取屬性的值
get = self.driver.find_element(By.CSS_SELECTOR, '[id="keepLoginon"]').get_attribute('title')
print(get)
# 結果:保持登錄
6、元素判斷
- 沒有演示環(huán)境,就自己寫一個html頁面
在頁面中顯示元素:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>演示數(shù)據(jù)</title>
</head>
<body>
<form>
<input type="text" value="用戶名" id="account"><br>
<input type="password" value="密碼" id="password"><br>
</form>
</body>
</html>
在頁面中不顯示元素:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>演示數(shù)據(jù)</title>
</head>
<body>
<form>
<input style="visibility: hidden;" type="text" value="用戶名" id="account"><br>
<input type="password" value="密碼" id="password"><br>
</form>
</body>
</html>
禁用輸入框:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>演示數(shù)據(jù)</title>
</head>
<body>
<form>
<input disabled="disabled" type="text" value="用戶名" id="account"><br>
<input type="password" value="密碼" id="password"><br>
</form>
</body>
</html>
1、is_displayed()
1、is_displayed():判斷元素是否存在,結果是真或假
1-1顯示元素,在HTML里,在頁面也顯示,返回True,
1-2隱藏元素,在HTML里,不在頁面顯示,返回Flase
1-3不在HTML里,不存在這個元素,會報錯
# 判斷輸入框是否在頁面中顯示
drive = self.driver.find_element(By.CSS_SELECTOR, '#account').is_displayed()
print(f"元素是否顯示:{drive}")
2、is_enabled()
is_enabled():判斷是否可用
# 判斷輸入框是否可以輸入
drive = self.driver.find_element(By.CSS_SELECTOR, '#account').is_enabled()
print(f"輸入框是否可以輸入:{drive}")
3、is_selected()
- 禪道登陸頁面演示
is_selected():判斷是否選中,一般用于復選框或單選框的選中判斷
# 勾選保持登陸操作
# self.driver.find_element(By.CSS_SELECTOR, '[name="keepLogin[]"]').click()
drive = self.driver.find_element(By.CSS_SELECTOR, '[name="keepLogin[]"]').is_selected()
if drive:
print(f"已勾選:{drive}")
else:
print(f"未勾選:{drive}")
7、iframe&frame切換
說明:在html語法中,frame 元素或者iframe元素的內(nèi)部會包含一個被嵌入的另一份html文檔,這個時候如果我們需要操作iframe內(nèi)的文檔,就需要先切換到被嵌入的文檔中,才可以進行操作。文章來源:http://www.zghlxwxcb.cn/news/detail-416843.html
-
禪道登陸后演示
1.先定位到需要切換的文檔 — iframe&frame
2.切換文檔(切到frame中):switch_to.frame()
3.從子frame切回到父frame:switch_to.parent_frame()
4.切換到最外層文檔(從frame中切回主文檔):switch_to.default_content()
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
# 登陸禪道
self.driver.find_element(By.CSS_SELECTOR, '[id="account"]').send_keys("admin")
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, '[name="password"').send_keys("123456")
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, '[id="submit"]').click()
time.sleep(1)
# 切換方法如下:
# 方法一
# iframe = self.driver.find_elements_by_tag_name("iframe")[0]
# self.driver.switch_to.frame(iframe)
# 方法二
# self.driver.switch_to.frame(0)
# 方法三
iframe = self.driver.find_element(By.CSS_SELECTOR, '#appIframe-my')
self.driver.switch_to.frame(iframe)
time.sleep(1)
# 點擊聯(lián)系人
self.driver.find_element(By.XPATH, '//*[@id="navbar"]/ul/li[5]/a').click()
# 切換到最外層表單
self.driver.switch_to.default_content()
time.sleep(1)
# 點擊項目
self.driver.find_element(By.CSS_SELECTOR, '#menu [data-app="project"]').click()
8、鼠標懸停
-
禪道登陸界面,選擇語言
- 鼠標懸停需要導入:from selenium.webdriver import ActionChains
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
# 需要懸停的元素,懸停到語言選擇框上
hover = self.driver.find_element(By.CSS_SELECTOR, '[class="btn"]')
# 鼠標懸停 ActionChains(瀏覽器).move_to_element(懸停的元素).perform() 執(zhí)行操作
ActionChains(self.driver).move_to_element(hover).perform()
time.sleep(1)
# 選擇需要的語言
self.driver.find_element(By.CSS_SELECTOR, '[data-value="zh-tw"]').click()
像iframe切換/鼠標懸停為提高成功率,最好是在操作后sleep(1)秒文章來源地址http://www.zghlxwxcb.cn/news/detail-416843.html
9、警告框處理
-
禪道登陸演示
警告框處理:switch_to.alert
def method(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('http://192.168.100.210/zentao/')
# 點擊登陸
self.driver.find_element(By.CSS_SELECTOR, '[id="submit"]').click()
time.sleep(1)
# 獲取警告框的文本信息
alert_msg = self.driver.switch_to.alert.text
print(alert_msg)
# 接受警告框 accept()
self.driver.switch_to.alert.accept()
# 取消警告框 dismiss()
# self.driver.switch_to.alert.dismiss()
10、窗口切換
- 切換窗口:switch_to.window(需要切換到的窗口)
def page_switching(self):
"""代碼執(zhí)行"""
# 打開百度
self.driver.get('https://www.baidu.com/')
# 搜索框輸入:CSDN
self.driver.find_element(By.CSS_SELECTOR, '[name="wd"]').send_keys("csdn")
time.sleep(0.5)
# 點擊百度一下
self.driver.find_element(By.CSS_SELECTOR, '[id="su"]').click()
time.sleep(0.5)
# 點擊CSDN官網(wǎng),開啟新窗口,進入CSDN官網(wǎng)
self.driver.find_element(By.LINK_TEXT, 'CSDN技術社區(qū)').click()
time.sleep(3)
# 獲取當前窗口(當前句柄名稱-handle)
windows = self.driver.current_window_handle
print(f"當前handle:{windows}")
# 獲取所有窗口(所有句柄名稱-handle),以列表的形式返回過來
all_windows = self.driver.window_handles
print(f"所有handle:{all_windows}")
# 切換窗口,根據(jù)所有窗口的下標來切換,窗口順序從0開始。(此時有兩個窗口,第一個百度,第二個csdn)
self.driver.switch_to.window(all_windows[0])
time.sleep(3)
# 切換到最新窗口的句柄(csdn)
self.driver.switch_to.window(all_windows[-1])
11、select標簽的下拉框選擇
- 沒有演示環(huán)境,就自己寫一個html頁面:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>演示數(shù)據(jù)</title>
</head>
<body>
<select id="nr" name="wan">
<option value="10">每頁顯示10條</option>
<option value="20">每頁顯示20條</option>
<option value="50">每頁顯示50條</option>
<option value="100">每頁顯示100條</option>
</select>
</body>
</html>
- 首先需要先導入一個包(注意Select的S需要大寫)
- from selenium.webdriver.support.ui import Select
def select(self):
"""代碼執(zhí)行"""
# 打開本地hthl頁面
self.driver.get('file:///C:/Users/Admin/Desktop/hthl.html')
# 需要先定位到下拉框
elements = self.driver.find_element(By.CSS_SELECTOR, '#nr')
# Select(需要操作下拉框).根據(jù)什么操作
time.sleep(2)
Select(elements).select_by_index(1) # 根據(jù)index,下標定位,從0開始
time.sleep(2)
Select(elements).select_by_value('100') # 根據(jù)value定位
time.sleep(2)
Select(elements).select_by_visible_text('每頁顯示50條') # 根據(jù)文本定位
12、執(zhí)行JavaScript腳本
- ①在京東商品頁面模擬頁面上下滑動
def jd_search(self):
"""代碼執(zhí)行"""
# 通過get()方法打開網(wǎng)頁
self.driver.get('https://www.jd.com/')
# 搜索框輸入:python
self.driver.find_element(By.CSS_SELECTOR, '#key').send_keys("python")
# 點擊搜索
self.driver.find_element(By.CSS_SELECTOR, '.search-m .button').click()
time.sleep(1)
# 執(zhí)行JavaScript腳本,將當前頁面滾動條位置滑動到最底部
# 傳入了兩個參數(shù)0和document.body.scrollHeight,表示要在窗口的水平坐標為0、垂直坐標為當前頁面總高度的位置處進行滑動
# 注:在實際應用中,該代碼可用于模擬用戶下滑頁面的操作,以加載更多內(nèi)容或觸發(fā)特定事件
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 等待頁面加載完成,再次滑動頁面到最底部
time.sleep(2)
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 等待2秒,滑動到最頂部
time.sleep(2)
self.driver.execute_script("window.scrollTo(0, 0)")
time.sleep(2)
- ②點擊方法和輸入方法
def positioning_method(self):
"""代碼執(zhí)行"""
self.driver.get('https://www.csdn.net/')
# 通過文本定位元素: '//*[contains(text(),"文本")]',并通過JavaScript方法點擊
element = self.driver.find_element(By.XPATH, '//*[contains(text(),"博客")]')
self.driver.execute_script('arguments[0].click()', element)
time.sleep(2)
# 通過元素的屬性和屬性值定位元素: '//*[@元素]',并通過JavaScript方法點擊
element = self.driver.find_element(By.XPATH, '//*[@data-report-query="spm=3001.6907"]')
self.driver.execute_script('arguments[0].click()', element)
time.sleep(2)
# 通過標簽名和屬性值定位元素: '//元素[@元素]',并通過JavaScript方法輸入
element = self.driver.find_element(By.XPATH, '//input[@class="el-input__inner"]')
self.driver.execute_script('arguments[0].value = "軟件測試";', element)
time.sleep(2)
13、WebDriver對象的屬性
- WebDriver對象具有許多可直接使用的屬性。以下是一些常用的屬性:
def get_attribute(self):
"""代碼執(zhí)行"""
# 打開百度
self.driver.get('https://www.baidu.com/')
# 獲取當前瀏覽器的URL
print(self.driver.current_url)
# 獲取當前瀏覽器窗口的標題
print(self.driver.title)
# 獲取當前頁面的源代碼
print(self.driver.page_source)
# 獲取有關瀏覽器的相關信息,如瀏覽器名稱、版本等
print(self.driver.capabilities)
# 獲取應用程序緩存API的實例
print(self.driver.application_cache)
# 獲取當前會話的唯一標識符
print(self.driver.session_id)
到了這里,關于Python+Selenium自動化測試詳細教程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!