欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Web自動化之Selenium常用操作方法大全

 更新時間:2023年06月19日 14:10:47   作者:東方不敗之鴨梨的測試筆記  
Selenium是一種自動化測試工具,可以用于測試Web應(yīng)用程序,它提供了一組用于自動化Web瀏覽器進行測試的API,下面這篇文章主要給大家介紹了關(guān)于Web自動化之Selenium常用操作方法的相關(guān)資料,需要的朋友可以參考下

本文總結(jié)使用selenium進行web/UI自動化時,會用到的一些常用操作。

定位元素

driver.find_element_by_xpath()#1、絕對路徑 2、元素屬性 3、層級和屬性結(jié)合 4、使用邏輯運算符
driver.find_element_by_id()#根據(jù)id定位,HTML規(guī)定id屬性在HTML文檔中必須是唯一的
driver.find_element_by_name()#name屬性定位
driver.find_element_by_class_name()#class屬性定位
driver.find_element_by_tag_name()#標(biāo)簽名字定位 因為標(biāo)簽基本都不是唯一的,所以不用這個
driver.find_element_by_link_text()#定位文本鏈接,需要對應(yīng)的元素有href屬性
driver.find_element_by_partial_link_text()#模糊定位文本鏈接
driver.find_element_by_css_selector()#CSS選擇器

By定位元素

是元素定位另外一種方式,跟上面的8種底層一樣。

from selenium.webdriver.common import By
driver.find_element(By.ID,'kw')

定位一組元素

driver.find_elements_by_xpath()#其他方法同理
driver.find_elements(By.XPATH,'') 

瀏覽器操作

driver.set_window_size()#設(shè)置瀏覽器大小,可以設(shè)置成移動端大小
driver.back()#瀏覽器后退
driver.forward()#瀏覽器前進
driver.set_window_position()
driver.set_window_rect()
driver.refresh()#模擬瀏覽器刷新
driver.maximize_window()#最大化瀏覽器

設(shè)置瀏覽器參數(shù)

在定義driver的時候設(shè)置chrome_options參數(shù),該參數(shù)是一個Options類所實例化的對象。其中,常用的參數(shù)是設(shè)置瀏覽器是否可視化和瀏覽器的請求頭等信息,前者可以加快代碼的運行速度,后者可以有效地防止網(wǎng)站的反爬蟲檢測

from selenium.webdriver.chrome.options import Options
url='https://movie.douban.com/'
#Options類實例化
chrome_options=Options()
#設(shè)置瀏覽器參數(shù)
#--headless是不 顯示瀏覽器啟動和執(zhí)行過程c
chrome_options.add_argument('--headless')
#設(shè)置lang和User-Agent信息,防止反爬蟲檢測
chrome_options.add_argument('lang=zh_CN.UTF-8')
UserAgent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.101 Safari/537.36'
chrome_options.add_argument('User-Agent='+UserAgent)
#啟動瀏覽器并設(shè)置chrome_options參數(shù)
driver=webdriver.Chrome(options=chrome_options)
driver.get(url)
driver.maximize_window()
print(driver.title)
# print(driver.page_source) #獲取網(wǎng)頁的html代碼

元素操作

driver.find_element_by_xpath().click()#點擊元素
driver.find_element_by_xpath().clear()#清空文本
driver.find_element_by_xpath().send_keys()#模擬鍵盤輸入

頁面交互

webElement接口提供了一些可以與頁面交互的方法

submit和click在某些情況下可以互換,submit只用于表單的提交按鈕。

driver.find_element_by_xpath().submit()#提交輸入框的內(nèi)容 類似于回車提交搜索框內(nèi)容
driver.find_element_by_xpath().size#返回元素尺寸
driver.find_element_by_xpath().text#獲取元素文本
driver.find_element_by_xpath().get_attribute()#獲取元素屬性值
driver.find_element_by_xpath().is_selected()#是否被選中
driver.find_element_by_xpath().is_enabled()#判斷元素是否可以使用
driver.find_element_by_xpath().is_displayed()#返回元素是否用戶可見

鼠標(biāo)事件

關(guān)于鼠標(biāo)操作的方法都封裝在Actionchains中

from selenium.webdriver.common.action_chains import ActionChains
rigt_check=driver.find_element_by_id('kw')
ActionChains(driver).context_click(rigt_check).perform()#context_click對元素右擊操作
#perform()執(zhí)行所有ActionChains中存儲的行為
ActionChains(driver).move_to_element(rigt_check).perform()#鼠標(biāo)懸停
ActionChains(driver).double_click(rigt_check).perform()#鼠標(biāo)雙擊
ActionChains(driver).drag_and_drop(source,target).perform()#鼠標(biāo)由源元素拖動至目標(biāo)元素

url='https://passport.bilibili.com/login'
 
driver=webdriver.Chrome()
driver.get(url)
#雙擊登錄按鈕
ele=driver.find_element_by_class_name('tit')
ActionChains(driver).double_click(ele).perform()
sleep(2)
#拖拽滑塊
ele=driver.find_element_by_class_name('gt_slider_knob,gt_show')
ActionChains(driver).drag_and_drop_by_offset(ele,100,0).perform()

鍵盤事件

模擬鍵盤輸入,可以是按鍵,組合鍵。

from selenium.webdriver.common.keys import Keys
driver.find_element_by_xpath().send_keys(Keys.BACK_SPACE)#對該元素操作一次backspace
driver.find_element_by_xpath().send_keys(Keys.SPACE)#對該元素輸入空格
driver.find_element_by_xpath().send_keys(Keys.CONTROL,'a')#ctrl+A全選輸入框內(nèi)容
driver.find_element_by_xpath().send_keys(Keys.CONTROL,'x')#ctrl+x剪切輸入框內(nèi)容
driver.find_element_by_xpath().send_keys(Keys.CONTROL,'v')#ctrl+v粘貼內(nèi)容到輸入框
driver.find_element_by_xpath().send_keys(Keys.ENTER)#通過回車鍵代替單擊操作
driver.find_element_by_xpath().send_keys(Keys.F1)#鍵盤F1

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from time import sleep
url='https://www.baidu.com'
 
driver=webdriver.Chrome()
driver.get(url)
ele=driver.find_element_by_id('kw')
ele.send_keys("selenium")
sleep(2)
#刪除最后一個文字
ele.send_keys(Keys.BACK_SPACE)
sleep(2)
 
#添加空格鍵+教程
ele.send_keys(Keys.SPACE)
ele.send_keys("教程")
sleep(2)
 
#ctrl+a全選輸入框內(nèi)容
ele.send_keys(Keys.CONTROL,'a')
sleep(2)
 
#ctrl+x 剪切輸入框內(nèi)容
ele.send_keys(Keys.CONTROL,'x')
sleep(2)
 
 
#ctrl+v 粘貼內(nèi)容到輸入框
ele.send_keys(Keys.CONTROL,'v')
sleep(2)
 
#回車鍵代替單擊
driver.find_element_by_id('su').send_keys(Keys.ENTER)

獲得驗證信息

自動化用例執(zhí)行完成后,可以從頁面上獲取一些信息來證明用例執(zhí)行成功或者失敗

driver.title #獲得頁面title
driver.current_url#獲得頁面curl
driver.find_element_by_xpath().text#獲取元素文本

元素等待

由于web頁面多數(shù)使用AJAX技術(shù),瀏覽器在加載頁面時,頁面上的元素可能不是同時被加載完成的,需要加入等待。

顯式等待:顯性等待能夠根據(jù)判斷條件而靈活地等待,程序每隔一段時間檢測一次,如果檢測結(jié)果與條件相符,就執(zhí)行下一步,否則繼續(xù)等待,直到超過設(shè)置的最長時間為止

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element=WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located(By.ID,'kw'))
#每0.5秒檢測一次這個元素能否被定位到,5秒后超時
#expected_conditions提供了很多預(yù)期條件判斷方法
#也可以用is_displayed()判斷元素是否可見

隱式等待

隱性等待是指在一個設(shè)定的時間內(nèi)檢測網(wǎng)頁是否加載完成,也就是一般情況下用戶看到瀏覽器標(biāo)簽欄那個小圈不再轉(zhuǎn),才會執(zhí)行下一步。比如代碼中設(shè)置30秒等待時間,網(wǎng)頁只要在30秒內(nèi)完成加載就會自動執(zhí)行下一步,如果超出30秒就會拋出異常。值得注意的是,隱性等待對整個driver的周期都起作用,所以只要設(shè)置一次即可。

通過一定的時長等待頁面上某元素加載完成,如果超出了設(shè)置的時長元素,還沒有被加載,則拋出沒有元素異常。

通常設(shè)置在driver后面。

driver.implicitly_wait(10)

sleep休眠方法

在需要的地方添加。

from time import sleep
sleep(3)

隱性等待和顯性等待相比于time.sleep這種強制等待更為靈活和智能,可解決各種網(wǎng)絡(luò)延誤的問題,隱性等待和顯性等待可以同時使用,但最長的等待時間取決于兩者之間的最大數(shù),如上述代碼的隱性等待時間為30秒,顯性等待時間為20秒,則該代碼的最長等待時間為隱性等待時間。 

多框架切換

frame是一個框架頁面,在HTML 5中已經(jīng)不支持使用框架,但在一些網(wǎng)站中依然會看到它的身影。frame的作用是在HTML代碼中嵌套一個或多個不同的HTML代碼,每嵌套一個HTML代碼都需要由frame來實現(xiàn)

iframe和frame實現(xiàn)的功能是相同的,只不過使用方式和靈活性有所不同,無論是iframe還是frame,Selenium的定位和操作方式都是一樣的

由于一個HTML可以嵌套一個或多個iframe,因此Selenium在操作不同的iframe時需要通過switch_to.frame()來切換到指定的iframe,再執(zhí)行相應(yīng)的操作 

driver.switch_to.frame('kw')#可以直接取表單的id或者name屬性,如果表單沒有這兩個屬性,可以先定位表單元素,再切換
driver.switch_to.parent_frame('kw')#跳出當(dāng)前一級表單
driver.switch_to.default_content('kw')#跳回最外層頁面
#根據(jù)索引定位
driver.switch_to_frame(0)
#根據(jù)id或者name屬性
driver.switch_to_frame('framea')
新版本 driver.switch_to.frame(0)

如百度知道的文本框

 如下代碼實現(xiàn)打開百度知道題目頁面,點擊我要回答,定位至iframe,輸入內(nèi)容,跳出iframe,并點擊提交回答按鈕

url='https://zhidao.baidu.com/question/1903337615241287780.html'
 
driver=webdriver.Chrome()
driver.get(url)
driver.maximize_window()
#點擊我要回答
driver.find_element_by_id('answer-bar').click()
#切換到frame內(nèi)部的html
driver.switch_to.frame('ueditor_0')
#定位frame內(nèi)部的元素
driver.find_element_by_xpath('/html/body').send_keys('美國')
#跳回網(wǎng)頁HTML 如果不切回網(wǎng)頁,則找不到提交回答按鈕,且js代碼也執(zhí)行不了
# driver.switch_to.default_content()
js='window.scrollTo(0,100)'
driver.execute_script(js)
sleep(3)
#點擊網(wǎng)頁提交回答按鈕
driver.find_element_by_xpath("http://div[@class='addons line']/a").click()

多窗口切換

search_windows=driver.current_window_handle #獲得當(dāng)前窗口句柄
all_handles=driver.window_handles #獲得所有窗口的句柄
driver.switch_to.window(handle)#切換窗口
handles=driver.window_handles
driver.switch_to_window(handles[0])
driver.switch_to_window(handles[1])

應(yīng)用

from selenium import webdriver
from selenium.webdriver.common.by import By
url='https://www.baidu.com/'
driver=webdriver.Chrome()
driver.get(url)
driver.implicitly_wait(10)
search_windows=driver.current_window_handle #獲得窗口句柄
driver.find_element_by_link_text('登錄').click()
driver.find_element_by_link_text('立即注冊').click()
import time
#獲得所有窗口的句柄
all_handles=driver.window_handles
#切換到注冊窗口
for handle in all_handles:
    if handle!=search_windows:
        driver.switch_to.window(handle)
        print("當(dāng)前是注冊窗口")
        time.sleep(2)
#回到搜索窗口
for handle in all_handles:
    if handle==search_windows:
        driver.switch_to.window(handle)
        print("當(dāng)前是搜索窗口")
        driver.find_element_by_id('TANGRAM__PSP_4__closeBtn').click()#關(guān)閉注冊窗口
        driver.find_element_by_id('kw').send_keys("selenium")
        driver.find_element_by_id('su').click()
        time.sleep(2)
driver.quit()
 

警告框處理

webdriver中處理JavaScript生成的alert,confirm,prompt十分簡單,具體做法是使用switch_to_alert方法定位到alert/confirm/prompt,然后使用text/accept/dismiss/send_keys等方法進行操作。

  • text:返回alert/confirm/prompt中的文字信息
  • accept():接受現(xiàn)有警告框
  • dismiss():解散現(xiàn)有警告框
  • send_keys:發(fā)送文本至警告框

應(yīng)用,如圖切換至alert并接受

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from time import sleep
url='https://www.baidu.com/'
driver=webdriver.Chrome()
driver.get(url)
driver.maximize_window()
driver.implicitly_wait(10)
#鼠標(biāo)懸停至設(shè)置鏈接
link=driver.find_element_by_id("s-usersetting-top")
ActionChains(driver).move_to_element(link).perform()
 
driver.find_element_by_link_text('搜索設(shè)置').click()
 
#保存設(shè)置
driver.find_element_by_class_name('prefpanelgo').click()
sleep(2)
#接受警告框
# driver.switch_to_alert().accept()
 
driver.quit()

上傳文件

一般文件上傳,是打開windows窗口從窗口中選擇本地文件,但webdriver無法操作windows控件。

1、普通上傳 將本地文件路徑作為值傳給input標(biāo)簽,注意必須是input標(biāo)簽

2、插件上傳,基于flash,js,Ajax等技術(shù)實現(xiàn)上傳

#定位上傳按鈕,添加本地文件
driver.find_element_by_name('file').send_keys("D:\\upload_file.txt")

另一種方法為基于AutoIt軟件來實現(xiàn)上傳。但是不推薦,因為不在Python范圍。

下載文件

webdriver允許設(shè)置默認(rèn)的文件下載路徑,文件會被自動下載并存放到設(shè)置的目錄中

操作cookie

什么情況下回用到cookie操作?當(dāng)開發(fā)人員開發(fā)一個功能,當(dāng)用戶登錄后,會將用戶的用戶名寫入瀏覽器cookie,指定key為username,就可以通過get_cookies()找到username,打印value。

url='https://www.youdao.com/'
 
driver=webdriver.Chrome()
driver.get(url)
driver.maximize_window()
driver.implicitly_wait(10)
 
# #獲得cookie
 
driver.add_cookie({'name':'Login_User','value':'Password'})
cookie=driver.get_cookies()
print("所有Cookie為",cookie)
#獲取name為Login_User的cookie
one_cookie=driver.get_cookie('Login_User')
print("Login_User的Cookie為",one_cookie)
# "刪除name為Login_User的cookie
driver.delete_cookie('Login_User')
 
surplus_cookies=driver.get_cookies()
print("剩余的cookie為:",surplus_cookies)
 
driver.delete_all_cookies()
surplus_cookies=driver.get_cookies()
print("剩余的cookie為:",surplus_cookies)
driver.quit()

返回結(jié)果為

所有Cookie為[{
    'domain': 'www.youdao.com',
    'httpOnly': False,
    'name': '___rl__test__cookies',
    'path': '/',
    'secure': False,
    'value': '1662293521877'
}, {
    'domain': '.youdao.com',
    'expiry': 1696853521,
    'httpOnly': False,
    'name': 'OUTFOX_SEARCH_USER_ID',
    'path': '/',
    'secure': False,
    'value': '"555592633@10.108.162.135"'
}, {
    'domain': 'www.youdao.com',
    'httpOnly': False,
    'name': 'Login_User',
    'path': '/',
    'secure': True,
    'value': 'Password'
}, {
    'domain': '.youdao.com',
    'expiry': 1696853520,
    'httpOnly': False,
    'name': 'OUTFOX_SEARCH_USER_ID_NCOO',
    'path': '/',
    'secure': False,
    'value': '1883563674.2397'
}]
Login_User的Cookie為 {
    'domain': 'www.youdao.com',
    'httpOnly': False,
    'name': 'Login_User',
    'path': '/',
    'secure': True,
    'value': 'Password'
}
剩余的cookie為: [{
    'domain': 'www.youdao.com',
    'httpOnly': False,
    'name': '___rl__test__cookies',
    'path': '/',
    'secure': False,
    'value': '1662293521877'
}, {
    'domain': '.youdao.com',
    'expiry': 1696853521,
    'httpOnly': False,
    'name': 'OUTFOX_SEARCH_USER_ID',
    'path': '/',
    'secure': False,
    'value': '"555592633@10.108.162.135"'
}, {
    'domain': '.youdao.com',
    'expiry': 1696853520,
    'httpOnly': False,
    'name': 'OUTFOX_SEARCH_USER_ID_NCOO',
    'path': '/',
    'secure': False,
    'value': '1883563674.2397'
}]
剩余的cookie為: []

調(diào)用Javascript

可以用來控制瀏覽器滾動條

url='https://www.baidu.com/'
 
driver=webdriver.Chrome()
driver.get(url)
 
driver.find_element_by_id('kw').send_keys("selenium")
driver.find_element_by_id('su').click()
driver.set_window_size(600,600)
#通過js設(shè)置瀏覽器窗口的滾動條位置
js="window.scrollTo(500,500);"
driver.execute_script(js)
 

窗口截圖

url='https://www.baidu.com/'
 
driver=webdriver.Chrome()
driver.get(url)
 
driver.find_element_by_id('kw').send_keys("selenium")
driver.find_element_by_id('su').click()
sleep(2)
driver.get_screenshot_as_file("C:\\Users\\yangyl13\\Desktop\\3.png")
driver.quit()

關(guān)閉窗口

driver.quit() #退出相關(guān)驅(qū)動程序,關(guān)閉所有窗口

driver.close()#關(guān)閉單個窗口。

驗證碼處理

1、測試環(huán)境去掉驗證碼

2、萬能驗證碼

3、驗證碼識別技術(shù) 如python-tesseract

4、記錄cookie

下拉框選擇

from selenium.webdriver.support.select import Select
Select(driver.find_element_by_id('')).select_by_index('2')#根據(jù)下拉框索引選擇
Select(driver.find_element_by_id('')).select_by_value('Python')#根據(jù)下拉框value屬性選擇
Select(driver.find_element_by_id('')).select_by_visible_text('Python')#根據(jù)下拉框可見文本選擇

總結(jié)

到此這篇關(guān)于Web自動化之Selenium常用操作方法大全的文章就介紹到這了,更多相關(guān)Web自動化Selenium常用操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python Pandas創(chuàng)建Dataframe數(shù)據(jù)框的六種方法匯總

    Python Pandas創(chuàng)建Dataframe數(shù)據(jù)框的六種方法匯總

    這篇文章主要介紹了Python中的Pandas創(chuàng)建Dataframe數(shù)據(jù)框的六種方法,創(chuàng)建Dataframe主要是使用pandas中的DataFrame函數(shù),其核心就是第一個參數(shù):data,傳入原始數(shù)據(jù),因此我們可以據(jù)此給出六種創(chuàng)建Dataframe的方法,需要的朋友可以參考下
    2023-05-05
  • Python torch.flatten()函數(shù)案例詳解

    Python torch.flatten()函數(shù)案例詳解

    這篇文章主要介紹了Python torch.flatten()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 解決linux下使用python打開terminal時報錯的問題

    解決linux下使用python打開terminal時報錯的問題

    這篇文章主要介紹了linux下使用python打開terminal時報錯,本文通過兩種場景分析給大家詳細講解,需要的朋友可以參考下
    2023-03-03
  • Python3實現(xiàn)英文字母轉(zhuǎn)換哥特式字體實例代碼

    Python3實現(xiàn)英文字母轉(zhuǎn)換哥特式字體實例代碼

    這篇文章主要給大家介紹了關(guān)于Python3實現(xiàn)英文字母轉(zhuǎn)換哥特式字體的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python對圖像進行灰度處理的代碼介紹

    Python對圖像進行灰度處理的代碼介紹

    這篇文章主要給大家介紹了關(guān)于Python對圖像進行灰度處理的相關(guān)資料,圖像灰度化是將一幅彩色圖像轉(zhuǎn)換為灰度化圖像的過程,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • ???????如何利用python破解zip加密文件

    ???????如何利用python破解zip加密文件

    這篇文章主要介紹了???????如何利用python破解zip加密文件,文章基于python的相關(guān)資料展開破解zip加密文件的詳細內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • Python如何讀取、寫入CSV數(shù)據(jù)

    Python如何讀取、寫入CSV數(shù)據(jù)

    這篇文章主要介紹了Python如何讀寫CSV數(shù)據(jù),文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 使用anaconda的pip安裝第三方python包的操作步驟

    使用anaconda的pip安裝第三方python包的操作步驟

    今天小編就為大家分享一篇使用anaconda的pip安裝第三方python包的操作步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python 讀取更新中的log 或其它文本方式

    python 讀取更新中的log 或其它文本方式

    今天就為大家分享一篇python 讀取更新中的log 或其它文本方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 詳解pytest中runtestprotocol方法的實現(xiàn)

    詳解pytest中runtestprotocol方法的實現(xiàn)

    runtestprotocol 是 pytest 執(zhí)行測試流程中的一個核心函數(shù),它主要負(fù)責(zé)調(diào)用測試函數(shù)的“setup”、“call”和“teardown”鉤子函數(shù),并生成對應(yīng)的測試報告,本文將深入探究pytest中runtestprotocol方法的實現(xiàn),需要的朋友可以參考下
    2023-10-10

最新評論