国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

做財經(jīng)直播網(wǎng)站商業(yè)軟文案例

做財經(jīng)直播網(wǎng)站,商業(yè)軟文案例,湘西網(wǎng)站建設(shè)吧,業(yè)務(wù)代刷平臺網(wǎng)站怎么做文檔說明 Selenium是一個用于Web應(yīng)用程序自動化測試的工具。Selenium測試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。 Selenium測試的主要功能包括: 測試與瀏覽器的兼容性:測試應(yīng)用程序是否能很好的工作在不同的瀏覽器和操作系統(tǒng)之上。…

文檔說明

Selenium是一個用于Web應(yīng)用程序自動化測試的工具。Selenium測試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣。

Selenium測試的主要功能包括:

測試與瀏覽器的兼容性:測試應(yīng)用程序是否能很好的工作在不同的瀏覽器和操作系統(tǒng)之上。

測試系統(tǒng)功能:創(chuàng)建回歸測試,檢驗(yàn)軟件功能和用戶需求。

本文以Python語言為例,主要系統(tǒng)介紹Selenium3.0自動化測試框架的使用中的各種基礎(chǔ)、常規(guī)操作。

通過學(xué)習(xí)和實(shí)踐,達(dá)到能夠在Python + Selenium的技術(shù)架構(gòu)下進(jìn)行Web自動化入門測試的目的。

Web自動化測試的技術(shù)選型

Web自動化測試工具種類繁多,選擇標(biāo)準(zhǔn)應(yīng)該從以下幾個方面重點(diǎn)考慮:

開源免費(fèi)

業(yè)界主流,發(fā)展趨勢穩(wěn)定上升

支持主流的瀏覽器(Chrome、 Firefox、IE等)

支持主流編程語言(Python、Java等)

Selenium的特點(diǎn)

開源免費(fèi)

多瀏覽器支持:Chrome、Firefox、IE、Edge、Opera、Safari

多平臺支持:Windows、Linux、Mac

多語言支持:Python、Java、Ruby、JavaScript、C#、C++

支持錄制、回放和腳本生成(使用Selenium IDE)

支持分布式測試(使用Selenium Grid)

Selenium三劍客

通常所說的Selenium是對Selenium的總稱,其中包含三個項目:

Selenium WebDriver,Selenium IDE,Selenium Grid

Selenium WebDriver是客戶端API接口,測試人員通過調(diào)用這些接口,來訪問瀏覽器驅(qū)動,瀏覽器驅(qū)動再訪問瀏覽器。

Selenium IDE是一個瀏覽器插件,支持Chrome和Firefox瀏覽器,可以將手動測試過程記錄下來生成自動化測試腳本,可以回放。對于初學(xué)者的學(xué)習(xí)腳本和回歸測試很有幫助。

Selenium Grid適合分布式測試,例如電商平臺的618、雙11這種高并發(fā)的測試??梢栽俣嗯_計算機(jī)上進(jìn)行分布式擴(kuò)容,并從一個中心點(diǎn)管理多個環(huán)境,從而輕松的多多種瀏覽器/OS的組合運(yùn)行測試。

Selenium的前世今生

Selenium的命名

Selenium官網(wǎng):www.seleniumhq.org

Selenium的命名比較有意思,ThoughtWorks的Jason Huggins在2004年發(fā)起了Selenium項目,當(dāng)時的QTP mercury是主流的商業(yè)自化工具,是化學(xué)元素汞(俗稱水銀),而Selenium是開源自動化工具,是化學(xué)元素硒,硒可以對抗汞。

Selenium 1.0

用簡單的公式:

Selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC

Selenium IDE

Selenium IDE是嵌入到Firefox瀏覽器中的一個插件,實(shí)現(xiàn)簡單的瀏覽器操作的錄制與回放功能。

Selenium Grid

Selenium Grid是一種自動化的測試輔助工具,Grid通過利用現(xiàn)有的計算機(jī)基礎(chǔ)設(shè)施,能加快Web-App的功能測試。利用Grid可以很方便地實(shí)現(xiàn)在多臺機(jī)器上和異構(gòu)環(huán)境中運(yùn)行測試用例。

Selenium RC

Selenium RC(Remote Control)是Selenium家族的核心部分。Selenium RC 支持多種不同語言編寫的自動化測試腳本,通過Selenium RC的服務(wù)器作為代理服務(wù)器去訪問應(yīng)用,從而達(dá)到測試的目的。

Selenium RC分為Client Libraries和Selenium Server。Client Libraries庫主要用于編寫測試腳本,用來控制Selenium Server的庫。Selenium Server負(fù)責(zé)控制瀏覽器行為。

Selenium1.0的核心是RC,它的工作原理是這樣的:

在2006年的時候,Google的工程師Simon Stewart發(fā)起了WebDriver的項目;因?yàn)殚L期以來Google一直是Selenium的重度用戶,但卻被限制在有限的操作范圍內(nèi)。

Selenium RC 是在瀏覽器中運(yùn)行JavaScript應(yīng)用,使用瀏覽器內(nèi)置的JavaScript翻譯器來翻譯和執(zhí)行selenese命令(selenese是Selenium命令集合)。

WebDriver是通過原生瀏覽器支持或者瀏覽器擴(kuò)展來直接控制瀏覽器。WebDriver針對各個瀏覽器而開發(fā),取代了嵌入到被測Web應(yīng)用中的JavaScript,與瀏覽器緊密集成,因此支持創(chuàng)建更高級的測試,避免了JavaScript安全模型導(dǎo)致的限制。除了來自瀏覽器廠商的支持之外,WebDriver還利用操作系統(tǒng)級的調(diào)用,模擬用戶輸入。

Selenium與WebDriver原是屬于兩個不同的項目,WebDriver的創(chuàng)建者Simon Stewart早在2009年8月的一份郵件中解釋了項目合并的原因。

Selenium與WebDriver合并原因:為何把兩個項目合并?部分原因是WebDriver解決了Selenium存在的缺點(diǎn)(例如能夠繞過JavaScript沙箱,我們有出色的API),部分原因是Selenium解決了WebDriver存在的問題(例如支持廣泛的瀏覽器),部分原因是因?yàn)镾elenium的主要貢獻(xiàn)者和我都覺得合并項目是為用戶提供最優(yōu)秀框架的最佳途徑。

Selenium 2.0

因?yàn)镾elenium和Webdriver的合并,所以,Selenium 2.0由此誕生。

簡單用公式表示為:Selenium 2.0 = Selenium 1.0 + WebDriver

需要強(qiáng)調(diào)的是,在Selenium 2.0中主推的是WebDriver,可以將其看作Selenium RC的替代品。因?yàn)镾elenium為了保持向下的兼容性,所以在Selenium 2.0中并沒有徹底地拋棄Selenium RC。

Selenium2.0的核心是WebDriver。

Selenium 3.0

Selenium 3.0 = Selenium 2.0 - Selenium RC(Remote Control)

? ? ? ? ? ? ? ? ? ? ? =?Selenium IDE?+ Selenium Grid + WebDriver (Selenium三劍客)

Selenium 2.0 = Selenium 1.0 + WebDriver

Selenium 1.0 = Selenium IDE + Selenium Grid + Selenium RC

Selenium 3.0做了如下的更新:

1,去掉了RC

2,Selenium3.0只支持Java8版本以上。

3,Selenium3.0中的Firefox瀏覽器驅(qū)動獨(dú)立了,以前裝完selenium2就可以驅(qū)動Firefox瀏覽器了,現(xiàn)在和Chrome一樣,必須下載和設(shè)置瀏覽器驅(qū)動。

4,MAC OS 集成Safari的瀏覽器驅(qū)動。默認(rèn)在/usr/bin/safaridriver 目錄下。

5,只支持IE 9.0版本以上。

Selenium 4.0

目前已經(jīng)更新到4.X版本了,有新的特性以及更新了一些方法的使用。本文以3.0作為說明。

安裝Selenium

先安裝Python,再安裝Selenium。

通過pip命令來安裝Selenium:

瀏覽器驅(qū)動

為什么要下載瀏覽器驅(qū)動

Selenium升級到3.0之后,對不同的瀏覽器驅(qū)動進(jìn)行了規(guī)范。如果想使用selenium驅(qū)動不同的瀏覽器,必須單獨(dú)下載并設(shè)置不同的瀏覽器驅(qū)動。

常用瀏覽器驅(qū)動的官方下載地址:

selenium · PyPI

設(shè)置瀏覽器驅(qū)動

瀏覽器的驅(qū)動要下載和瀏覽器配套的版本。

將下載的瀏覽器驅(qū)動放到Python的安裝目錄下,并且配置系統(tǒng)環(huán)境變量:

配置系統(tǒng)環(huán)境變量路徑:此電腦-->屬性-->高級系統(tǒng)設(shè)置-->環(huán)境變量-->系統(tǒng)變量-->Path,將“C:\Python379”目錄添加到Path的值中

測試瀏覽器驅(qū)動是否正常

IDE以Pycharm為例,創(chuàng)建 baidu.py文件,輸入以下內(nèi)容:

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com')

print(driver.title)

driver.quit()

若不報錯,成功打印百度主頁的title,說明瀏覽器驅(qū)動設(shè)置成功,可以繼續(xù)進(jìn)行接下來的操作了。

如報錯,請根據(jù)報錯提示檢查和修復(fù)。

元素定位

Selenium定位方法

Selenium提供了8種定位方式。

id

name

class name

tag name

link text

partial link text

xpath

css selector

這8種定位方式在Python selenium中所對應(yīng)的方法為:

find_element_by_id()

find_element_by_name()

find_element_by_class_name()

find_element_by_tag_name()

find_element_by_link_text()

find_element_by_partial_link_text()

find_element_by_xpath()

find_element_by_css_selector()

定位方法的用法

假如我們有一個Web頁面,通過前端工具(如:Firebug 官網(wǎng):https://getfirebug.com)查看到一個元素的屬性是如下這樣的:

<html>

<head>

<body link="#0000cc">

<a id="result_logo" href="/" οnmοusedοwn="return c({'fm':'tab','tab':'logo'})">

<form id="form" class="fm" name="f" action="/s">

<span class="soutu-btn"></span>

<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">

如果我們的目的是要定位input標(biāo)簽的輸入框。

通過id定位:

dr.find_element_by_id("kw")

通過name定位:

dr.find_element_by_name("wd")

通過class name定位:

dr.find_element_by_class_name("s_ipt")

通過tag name定位:

dr.find_element_by_tag_name("input")

通過xpath定位,xpath定位有N種寫法,這里列幾個常用寫法:

dr.find_element_by_xpath("//*[@id='kw']")

dr.find_element_by_xpath("//*[@name='wd']")

dr.find_element_by_xpath("//input[@class='s_ipt']")

dr.find_element_by_xpath("/html/body/form/span/input")

dr.find_element_by_xpath("//span[@class='soutu-btn']/input")

dr.find_element_by_xpath("//form[@id='form']/span/input")

dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")

通過css定位,css定位有N種寫法,這里列幾個常用寫法:

dr.find_element_by_css_selector("#kw")

dr.find_element_by_css_selector("[name=wd]")

dr.find_element_by_css_selector(".s_ipt")

dr.find_element_by_css_selector("html > body > form > span > input")

dr.find_element_by_css_selector("span.soutu-btn> input#kw")

dr.find_element_by_css_selector("form#form > span > input")

頁面上有一組文本鏈接:

<a class="mnav" href="http://news.baidu.com" name="tj_trnews">新聞</a>

<a class="mnav" href="http://www.hao123.com" name="tj_trhao123">hao123</a>

通過link text定位:

dr.find_element_by_link_text("新聞")

dr.find_element_by_link_text("hao123")

通過link text定位:

dr.find_element_by_partial_link_text("新")

dr.find_element_by_partial_link_text("hao")

dr.find_element_by_partial_link_text("123")

關(guān)于xpah和css的定位比較復(fù)雜,需要用到時可以單獨(dú)學(xué)習(xí),本文不展開:

XPath 語法

CSS 選擇器參考手冊

控制瀏覽器操作

控制瀏覽器窗口大小

有時候我們希望能以某種瀏覽器尺寸打開,讓訪問的頁面在這種尺寸下運(yùn)行。例如可以將瀏覽器設(shè)置成移動端大小(480* 800),然后訪問移動站點(diǎn),對其樣式進(jìn)行評估;WebDriver提供了set_window_size()方法來設(shè)置瀏覽器的大小。

from selenium import webdriver

import time

driver = webdriver.Chrome()

driver.get("http://m.baidu.com")

# 參數(shù)數(shù)字為像素點(diǎn)

print("設(shè)置瀏覽器寬480、高800顯示")

driver.set_window_size(480, 800)

time.sleep(10)

driver.quit()

在PC端執(zhí)行自動化測試腳本大多的情況下是希望瀏覽器在全屏幕模式下執(zhí)行,可以使用maximize_window()方法使打開的瀏覽器全屏顯示,其用法與set_window_size() 相同,它不需要參數(shù)。

from selenium import webdriver

import time

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

# 設(shè)置瀏覽器寬全屏顯示,不需要參數(shù)

print("設(shè)置瀏覽器寬全屏顯示")

driver.maximize_window()

time.sleep(10)

driver.quit()

控制瀏覽器后退、前進(jìn)

在使用瀏覽器瀏覽網(wǎng)頁時,瀏覽器提供了后退和前進(jìn)按鈕,可以方便地在瀏覽過的網(wǎng)頁之間切換,WebDriver也提供了對應(yīng)的back()和forward()方法來模擬后退和前進(jìn)按鈕。下面通過例子來演示這兩個方法的使用。

from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.baidu.com')

# 訪問百度首頁

first_url = 'http://www.baidu.com'

print("now access %s" %(first_url))

driver.get(first_url)

print(driver.title)

# 訪問新聞頁面

second_url='http://news.baidu.com'

print("now access %s" %(second_url))

driver.get(second_url)

print(driver.title)

# 返回(后退)到百度首頁

print("back to %s "%(first_url))

driver.back()

print(driver.title)

# 前進(jìn)到新聞頁

print("forward to %s"%(second_url))

driver.forward()

print(driver.title)

driver.quit()

為了看清腳本的執(zhí)行過程,下面每操作一步都通過print()來打印當(dāng)前的URL地址。

刷新頁面

有時候需要手動刷新(F5) 頁面,使用方法driver.refresh() ,刷新當(dāng)前頁面

WebDriver常用方法

點(diǎn)擊和輸入

定位元素只是第一步, 定位之后需要對這個元素進(jìn)行操作, 或單擊(按鈕) 或輸入(輸入框) , 下面認(rèn)識 WebDriver 中最常用的幾個方法:

clear(): 清除文本。

send_keys (value): 模擬按鍵輸入。

click(): 單擊元素。

from selenium import webdriver

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("selenium")

driver.find_element_by_id("su").click()

driver.quit()

提交

submit()

submit()方法用于提交表單。 例如, 在搜索框輸入關(guān)鍵字之后的“回車” 操作, 就可以通過該方法模擬。

from selenium import webdriver

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

search_text = driver.find_element_by_id('kw')

search_text.send_keys('selenium')

search_text.submit()

driver.quit()

有時候 submit()可以與 click()方法互換來使用, submit()同樣可以提交一個按鈕, 但 submit()的應(yīng)用范圍遠(yuǎn)不及 click()廣泛。

其他常用方法

size: 返回元素的尺寸。

text: 獲取元素的文本。

get_attribute(name): 獲得屬性值。

is_displayed(): 設(shè)置該元素是否用戶可見。

from selenium import webdriver

import time

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

# 獲得輸入框的尺寸

size = driver.find_element_by_id('kw').size

print(size)

# 返回百度頁面底部備案信息

text = driver.find_element_by_class_name('s-bottom-layer-content').text

print(text)

# 返回元素的屬性值, 可以是 id、 name、 type 或其他任意屬性

attribute = driver.find_element_by_id("kw").get_attribute('type')

print(attribute)

# 返回元素的結(jié)果是否可見, 返回結(jié)果為 True 或 False

result = driver.find_element_by_id("kw").is_displayed()

print(result)

time.sleep(10)

driver.quit()

輸出結(jié)果:

{'height': 44, 'width': 548}

設(shè)為首頁關(guān)于百度About Baidu百度營銷使用百度前必讀意見反饋幫助中心京公網(wǎng)安備11000002000001號京ICP證030173號?2021 Baidu (京)-經(jīng)營性-2017-0020

text

True

執(zhí)行上面的程序并查看結(jié)果: size 方法用于獲取百度輸入框的寬、 高, text 方法用于獲得百度底部的備案信息, get_attribute()用于獲得百度輸入的 type 屬性的值, is_displayed()用于返回一個元素是否可見, 如果可見則返回 True, 否則返回 False。

鼠標(biāo)事件

在 WebDriver 中, 將這些關(guān)于鼠標(biāo)操作的方法封裝在 ActionChains 類中提供。

ActionChains 類提供了鼠標(biāo)操作的常用方法:

perform(): 執(zhí)行所有 ActionChains 中存儲的行為;

context_click(): 右擊;

double_click(): 雙擊;

drag_and_drop(): 拖動;

move_to_element(): 鼠標(biāo)懸停。

鼠標(biāo)懸停操作

from selenium import webdriver

# 引入 ActionChains 類

from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

# 定位到要懸停的元素

above = driver.find_element_by_link_text("更多")

# 對定位到的元素執(zhí)行鼠標(biāo)懸停操作

ActionChains(driver).move_to_element(above).perform()

說明:

from selenium.webdriver import ActionChains

導(dǎo)入提供鼠標(biāo)操作的 ActionChains 類。

ActionChains(driver)

調(diào)用 ActionChains()類, 將瀏覽器驅(qū)動 driver 作為參數(shù)傳入。

move_to_element(above)

context_click()方法用于模擬鼠標(biāo)右鍵操作, 在調(diào)用時需要指定元素定位。

perform()

執(zhí)行所有 ActionChains 中存儲的行為, 可以理解成是對整個操作的提交動作。

鍵盤事件

Keys()類提供了鍵盤上幾乎所有按鍵的方法。 前面了解到, send_keys()方法可以用來模擬鍵盤輸入, 除此 之外, 我們還可以用它來輸入鍵盤上的按鍵, 甚至是組合鍵, 如 Ctrl+A、 Ctrl+C 等。

from selenium import webdriver

# 引入 Keys 模塊

from selenium.webdriver.common.keys import Keys

import time

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

# 輸入框輸入內(nèi)容

driver.find_element_by_id("kw").send_keys("seleniumm")

time.sleep(2)

# 刪除多輸入的一個 m

driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)

time.sleep(2)

# 輸入空格鍵+“教程”

driver.find_element_by_id("kw").send_keys(Keys.SPACE)

time.sleep(2)

driver.find_element_by_id("kw").send_keys("教程")

time.sleep(2)

# ctrl+a 全選輸入框內(nèi)容

driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')

time.sleep(2)

# ctrl+x 剪切輸入框內(nèi)容

driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')

time.sleep(2)

# ctrl+v 粘貼內(nèi)容到輸入框

driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')

time.sleep(2)

# 通過回車鍵來代替單擊操作

driver.find_element_by_id("su").send_keys(Keys.ENTER)

time.sleep(10)

driver.quit()

演示代碼為了能看清楚執(zhí)行過程,可以加入sleep(2),正式測試代碼不能加sleep等待方法。

上面的演示代碼沒有實(shí)際意義, 僅展示模擬鍵盤各種按鍵與組合鍵的用法。

說明:

from selenium.webdriver.common.keys import Keys

在使用鍵盤按鍵方法前需要先導(dǎo)入 keys 類。

以下為常用的鍵盤操作:

send_keys(Keys.BACK_SPACE) 刪除鍵(BackSpace)

send_keys(Keys.SPACE) 空格鍵(Space)

send_keys(Keys.TAB) 制表鍵(Tab)

send_keys(Keys.ESCAPE) 回退鍵(Esc)

send_keys(Keys.ENTER) 回車鍵(Enter)

send_keys(Keys.CONTROL,'a') 全選(Ctrl+A)

send_keys(Keys.CONTROL,'c') 復(fù)制(Ctrl+C)

send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)

send_keys(Keys.CONTROL,'v') 粘貼(Ctrl+V)

send_keys(Keys.F1) 鍵盤 F1

……

send_keys(Keys.F12) 鍵盤 F12

斷言

不管是在做功能測試還是自動化測試,最后一步需要拿實(shí)際結(jié)果與預(yù)期進(jìn)行比較。這個比較的稱之為斷言。

通??梢酝ㄟ^獲取title 、URL和text等信息進(jìn)行斷言。text方法在前面已經(jīng)講過,它用于獲取標(biāo)簽對之間的文本信息。 下面同樣以百度為例,介紹如何獲取這些信息。

from selenium import webdriver

from time import sleep

driver = webdriver.Firefox()

driver.get("https://www.baidu.com")

print('Before search================')

# 打印當(dāng)前頁面title

title = driver.title

print(title)

# 打印當(dāng)前頁面URL

now_url = driver.current_url

print(now_url)

driver.find_element_by_id("kw").send_keys("selenium")

driver.find_element_by_id("su").click()

sleep(1)

print('After search================')

# 再次打印當(dāng)前頁面title

title = driver.title

print(title)

# 打印當(dāng)前頁面URL

now_url = driver.current_url

print(now_url)

# 獲取結(jié)果數(shù)目

sleep(3)

user = driver.find_element_by_class_name('nums').text

print(user)

sleep(10)

driver.quit()

腳本運(yùn)行結(jié)果如下:

Before search================

百度一下,你就知道

https://www.baidu.com/

After search================

selenium_百度搜索

https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=selenium&fenlei=256&rsv_pq=f58b739f00005ced&rsv_t=dfc6adhvTMwlLK0URN0HpQmDI5YhaCf%2F%2ByTAk9xmtH9V8Vutx%2FSGErJI3DU&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=8&rsv_btype=i&inputT=194&rsv_sug4=194

搜索工具

百度為您找到相關(guān)結(jié)果約75,500,000個

說明:

title:用于獲得當(dāng)前頁面的標(biāo)題。

current_url:用戶獲得當(dāng)前頁面的URL。

text:獲取搜索條目的文本信息。

設(shè)置元素等待

WebDriver提供了兩種類型的等待:顯式等待和隱式等待。

顯式等待

顯式等待使WebDriver等待某個條件成立時繼續(xù)執(zhí)行,否則在達(dá)到最大時長時拋出超時異常(TimeoutException)。

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()

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

element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))

element.send_keys('selenium')

driver.quit()

WebDriverWait類是由WebDirver 提供的等待方法。在設(shè)置時間內(nèi),默認(rèn)每隔一段時間檢測一次當(dāng)前頁面元素是否存在,如果超過設(shè)置時間檢測不到則拋出異常。具體格式如下:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

driver :瀏覽器驅(qū)動。

timeout :最長超時時間,默認(rèn)以秒為單位。

poll_frequency :檢測的間隔(步長)時間,默認(rèn)為0.5S。

ignored_exceptions :超時后的異常信息,默認(rèn)情況下拋NoSuchElementException異常。

WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的說明。

until(method, message=‘’)

調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù),直到返回值為True。

until_not(method, message=‘’)

調(diào)用該方法提供的驅(qū)動程序作為一個參數(shù),直到返回值為False。

在本例中,通過as關(guān)鍵字將expected_conditions 重命名為EC,并調(diào)用presence_of_element_located()方法判斷元素是否存在。

隱式等待

WebDriver提供了implicitly_wait()方法來實(shí)現(xiàn)隱式等待,默認(rèn)設(shè)置為0。它的用法相對來說要簡單得多。

from selenium import webdriver

from selenium.common.exceptions import NoSuchElementException

from time import ctime

driver = webdriver.Firefox()

# 設(shè)置隱式等待為10秒

driver.implicitly_wait(10)

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

try:

print(ctime())

driver.find_element_by_id("kw22").send_keys('selenium')

except NoSuchElementException as e:

print(e)

finally:

print(ctime())

driver.quit()

implicitly_wait() 默認(rèn)參數(shù)的單位為秒,本例中設(shè)置等待時長為10秒。首先這10秒并非一個固定的等待時間,它并不影響腳本的執(zhí)行速度。其次,它并不針對頁面上的某一元素進(jìn)行等待。當(dāng)腳本執(zhí)行到某個元素定位時,如果元素可以定位,則繼續(xù)執(zhí)行;如果元素定位不到,則它將以輪詢的方式不斷地判斷元素是否被定位到。假設(shè)在第6秒定位到了元素則繼續(xù)執(zhí)行,若直到超出設(shè)置時長(10秒)還沒有定位到元素,則拋出異常。

定位一組元素

WebDriver提供了8種用于定位一組元素的方法。

find_elements_by_id()

find_elements_by_name()

find_elements_by_class_name()

find_elements_by_tag_name()

find_elements_by_link_text()

find_elements_by_partial_link_text()

find_elements_by_xpath()

find_elements_by_css_selector()

定位一組元素的方法與定位單個元素的方法類似,唯一的區(qū)別是在單詞element后面多了一個s表示復(fù)數(shù)。

接下來通過例子演示定位一組元素的使用:

from selenium import webdriver

from time import sleep

driver = webdriver.Chrome()

driver.get("https://www.baidu.com")

driver.find_element_by_id("kw").send_keys("selenium")

driver.find_element_by_id("su").click()

sleep(1)

# 定位一組元素

texts = driver.find_elements_by_xpath('//div/h3/a')

# 循環(huán)遍歷出每一條搜索結(jié)果的標(biāo)題

for t in texts:

print(t.text)

sleep(10)

driver.quit()

程序運(yùn)行結(jié)果:

MeterSphere - 開源自動化測試平臺

Selenium automates browsers. That's it!

Selenium(WEB自動化工具) - 百度百科

selenium中文網(wǎng) | selenium安裝、selenium使用、selenium...

Python+Selenium詳解(超全)

Selenium Python 測試教程網(wǎng)

Python Selenium庫的使用_凱耐的博客-CSDN博客_selenium

功能自動化測試工具——Selenium篇

selenium - 百度翻譯

Selenium環(huán)境安裝配置 - 環(huán)境配置 - 測試人社區(qū)

多表單切換

在Web應(yīng)用中經(jīng)常會遇到frame/iframe表單嵌套頁面的應(yīng)用,WebDriver只能在一個頁面上對元素識別與定位,對于frame/iframe表單內(nèi)嵌頁面上的元素?zé)o法直接定位。需要通過switch_to.frame()方法將當(dāng)前定位的主體切換為frame/iframe表單的內(nèi)嵌頁面中。

"""多表單切換"""

from selenium import webdriver

from time import sleep

class TestCase(object):

def __init__(self):

self.driver = webdriver.Chrome()

self.driver.get('http://sahitest.com/demo/framesTest.htm')

def test1(self):

top = self.driver.find_element_by_name('top')

self.driver.switch_to.frame(top)

self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td[1]/a[1]').click()

self.driver.switch_to.default_content()

sleep(3)

second = self.driver.find_element_by_xpath('/html/frameset/frame[2]')

self.driver.switch_to.frame(second)

self.driver.find_element_by_xpath('/html/body/table/tbody/tr/td[1]/a[2]').click()

sleep(5)

self.driver.quit()

if __name__ == '__main__':

case = TestCase()

case.test1()

switch_to.frame(reference) :切換frame,reference是傳入的參數(shù),用來定位frame,可以傳入id、name、index以及selenium的WebElement對象

switch_to_default_content() :返回主文檔

switch_to_parent_frame() :返回父文檔

多窗口切換

頁面操作過程中有時候點(diǎn)擊某個鏈接會彈出新的窗口,這時就需要主機(jī)切換到新打開的窗口上進(jìn)行操作。WebDriver提# 多窗口切換

from selenium import webdriver

from time import sleep

driver = webdriver.Chrome()

driver.implicitly_wait(10)

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

# 獲得百度搜索窗口句柄

search_windows = driver.current_window_handle

driver.find_element_by_link_text('登錄').click()

driver.find_element_by_link_text("立即注冊").click()

# 獲得當(dāng)前所有打開的窗口的句柄

all_handles = driver.window_handles

# 進(jìn)入注冊窗口

for handle in all_handles:

if handle != search_windows:

driver.switch_to.window(handle)

print('歡迎注冊!')

sleep(3)

pass

driver.quit()供了switch_to.window()方法,可以實(shí)現(xiàn)在不同的窗口之間切換。

說明:

current_window_handle:獲得當(dāng)前窗口句柄。

window_handles:返回所有窗口的句柄到當(dāng)前會話。

switch_to.window():用于切換到相應(yīng)的窗口,與上一節(jié)的switch_to.frame()類似,前者用于不同窗口的切換,后者用于不同表單之間的切換。

警告框處理

WebDriver中處理JavaScript所生成的alert、confirm、prompt的具體做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然后使用text/accept/dismiss/ send_keys等方法進(jìn)行操作。

說明:

text:返回 alert/confirm/prompt 中的文字信息。

accept():接受現(xiàn)有警告框。

dismiss():解散現(xiàn)有警告框。

send_keys(keysToSend):發(fā)送文本至警告框。keysToSend:將文本發(fā)送至警告框。

例如,百度搜索設(shè)置彈出的窗口是不能通過前端工具對其進(jìn)行定位的,這個時候就可以通過switch_to_alert()方法接受這個彈窗。

# 警告框處理

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains

from time import sleep

driver = webdriver.Chrome()

driver.implicitly_wait(10)

driver.get('http://www.baidu.com')

driver.maximize_window()

# 鼠標(biāo)懸停至“設(shè)置”鏈接

link = driver.find_element_by_xpath('//span[@id="s-usersetting-top"]')

ActionChains(driver).move_to_element(link).perform()

# 打開搜索設(shè)置

sleep(2)

driver.find_element_by_xpath('//div[@class="s-user-setting-pfmenu"]/a[@class="setpref"]').click()

# 保存設(shè)置

driver.find_element_by_xpath('//div[@id="se-setting-7"]/a[@class="prefpanelgo setting-btn c-btn c-btn-primary"]').click()

sleep(2)

# 接受警告框

driver.switch_to.alert.accept()

driver.quit()通過switch_to_alert()方法獲取當(dāng)前頁面上的警告框,并使用accept()方法接受警告框。

下拉框選擇

WebDriver提供了Select工具類來處理下拉框:

"""下拉框選擇"""

from selenium import webdriver

from time import sleep

import os

from selenium.webdriver.support.select import Select

class TestCase(object):

def __init__(self):

self.driver = webdriver.Chrome()

path = os.path.dirname(os.path.abspath(__file__))

file_path = 'file:///' + path + '/form.html'

self.driver.get(file_path)

def test_select(self):

se = self.driver.find_element_by_id('province')

select = Select(se)

select.select_by_index(0)

sleep(2)

select.select_by_value('sh')

sleep(2)

select.select_by_visible_text('西安')

sleep(2)

self.driver.quit()

if __name__ == '__main__':

case = TestCase()

case.test_select()

代碼中的form表單的form.html代碼如下:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

</head>

<body>

<form action="javascript:alert('test')">

provide:

<select name="province" id="province">

<option value="bj">北京</option>

<option value="xa">西安</option>

<option value="sh">上海</option>

</select>

</form>

</body>

</html>

說明:

Select類用于定位select標(biāo)簽。

Select_by_index() 根據(jù)索引選擇。

select_by_value() 根據(jù)值選擇。

select_by_visible_text()根據(jù)文本選擇。

文件上傳

對于通過input標(biāo)簽實(shí)現(xiàn)的上傳功能,可以將其看作是一個輸入框,即通過send_keys()指定本地文件路徑的方式實(shí)現(xiàn)文件上傳。

首先在Python工程同目錄下創(chuàng)建upfile.html文件:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>upload_file</title>

</head>

<body>

<div class="row-fluid">

<div class="span6 well">

<h1>upload_file</h1>

<input type="file" name="file" />

</div>

</div>

</body>

</html>

通過瀏覽器打開upfile.html文件,功能如下:

接著通過send_keys()方法來實(shí)現(xiàn)文件上傳。

"""文件上傳"""

from selenium import webdriver

from time import sleep

import os

driver = webdriver.Chrome()

file_path = 'file:///' + os.path.abspath('upfile.html')

driver.get(file_path)

# 定位上傳按鈕,添加本地文件

driver.find_element_by_name('file').send_keys('C:\\Users\\pc\\PycharmProjects\\pythonProject1\\upload_file.txt')

sleep(3)

driver.quit()

cookie操作

因?yàn)榛谡鎸?shí)cookie的測試是無法通過白盒和集成測試進(jìn)行的。有時候我們需要驗(yàn)證瀏覽器中cookie是否正確,WebDriver提供了操作Cookie的相關(guān)方法,可以讀取、添加和刪除cookie信息。

WebDriver操作cookie的方法:

get_cookies(): 獲得所有cookie信息。

get_cookie(name): 返回字典的key為“name”的cookie信息。

add_cookie(cookie_dict) : 添加cookie?!癱ookie_dict”指字典對象,必須有name 和value 值。

delete_cookie(name,optionsString):刪除cookie信息?!皀ame”是要刪除的cookie的名稱,“optionsString”是該cookie的選項,目前支持的選項包括“路徑”,“域”。

delete_all_cookies(): 刪除所有cookie信息。

舉例:通過get_cookies()來獲取當(dāng)前瀏覽器的cookie信息。

from selenium import webdriver

driver = webdriver.Firefox()

driver.get("http://www.youdao.com")

# 獲得cookie信息

cookie= driver.get_cookies()

# 將獲得cookie的信息打印

print(cookie)

driver.quit()

從執(zhí)行結(jié)果可以看出,cookie數(shù)據(jù)是以字典的形式進(jìn)行存放的:

[{'domain': '.baidu.com', 'expiry': 1614657905, 'httpOnly': False, 'name': 'BA_HECTOR', 'path': '/', 'secure': False, 'value': '8t8k212h0ga500cg2h1g3rar10q'},

{'domain': '.baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '33515_33272_31660_33595_33570_33601_26350_22159'},

{'domain': 'www.baidu.com', 'expiry': 1614654305, 'httpOnly': False, 'name': 'BD_LAST_QID', 'path': '/', 'secure': False, 'value': '9538733699940937218'},

{'domain': '.baidu.com', 'expiry': 1646190304, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '7663FBCB3A34639C54E8F25076262EF7:FG=1'},

{'domain': '.baidu.com', 'expiry': 3762137951, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '7663FBCB3A34639CA4A078B880E2933D'},

{'domain': '.baidu.com', 'expiry': 3762137951, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1614654304'},

{'domain': 'www.baidu.com', 'expiry': 1615518305, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'},

{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '1'}

]

知道了cookie的存放形式,就可以按照這種形式向?yàn)g覽器中寫入cookie信息。

"""向?yàn)g覽器添加cookie"""

from selenium import webdriver

driver = webdriver.Chrome()

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

# 向cookie的name 和value中添加會話信息

driver.add_cookie({'name': 'AAAAA', 'value': 'BBBBB'})

# 遍歷cookies中的name 和value信息并打印,當(dāng)然還有上面添加的信息

for cookie in driver.get_cookies():

print("%s -> %s" % (cookie['name'], cookie['value']))

driver.quit()

輸出結(jié)果:

C:\Python379\python.exe C:/Users/pc/PycharmProjects/pythonProject1/add_cookie.py

AAAAA -> BBBBB

BA_HECTOR -> 0t8100052l802l6l281g3rbbn0r

H_PS_PSSID -> 33516_33638_33273_31254_33570

BD_LAST_QID -> 15048048474274682553

BAIDUID -> 3D16A792E75CDD10BFF718B4812751EE:FG=1

BIDUPSID -> 3D16A792E75CDD10F3EFD20DBFC21C54

PSTM -> 1614654838

BD_UPN -> 12314753

BD_HOME -> 1

Process finished with exit code 0從執(zhí)行結(jié)果可以看到,第一條cookie信息是在腳本執(zhí)行過程中通過add_cookie()方法添加的。通過遍歷得到所有的cookie信息,從而找到key為“name”和“value”的特定cookie的value。

調(diào)用JavaScript代碼

雖然WebDriver提供了操作瀏覽器的前進(jìn)和后退方法,但對于瀏覽器滾動條并沒有提供相應(yīng)的操作方法。在這種情況下,就可以借助JavaScript來控制瀏覽器的滾動條。WebDriver提供了execute_script()方法來執(zhí)行JavaScript代碼。

"""調(diào)用js代碼"""

from selenium import webdriver

from time import sleep

# 訪問百度

from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()

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

# 搜索

driver.find_element_by_id("kw").send_keys("測試")

driver.find_element_by_id('su').send_keys(Keys.ENTER)

sleep(2)

# 設(shè)置瀏覽器窗口大小

driver.set_window_size(500, 500)

# 通過javascript設(shè)置瀏覽器窗口的滾動條位置

js = "window.scrollTo(100,450);"

driver.execute_script(js)

sleep(10)

driver.quit()

通過Chrome瀏覽器打開百度進(jìn)行搜索,并且提前通過set_window_size()方法將瀏覽器窗口設(shè)置為固定寬高顯示,目的是讓窗口出現(xiàn)水平和垂直滾動條。然后通過execute_script()方法執(zhí)行JavaScripts代碼來移動滾動條的位置。

窗口截圖

自動化用例是由程序去執(zhí)行的,因此有時候打印的錯誤信息并不十分明確。如果在腳本執(zhí)行出錯的時候能對當(dāng)前窗口截圖保存,那么通過圖片就可以非常直觀地看出出錯的原因。WebDriver提供了截圖函數(shù)get_screenshot_as_file()來截取當(dāng)前窗口。

"""窗口截圖"""

from selenium import webdriver

from time import sleep

from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()

driver.get('http://www.baidu.com')

driver.find_element_by_id('kw').send_keys('selenium')

driver.find_element_by_id('su').send_keys(Keys.ENTER)

sleep(2)

# 截取當(dāng)前窗口,并指定截圖圖片的保存位置

driver.get_screenshot_as_file("C:\\Users\\pc\\PycharmProjects\\pythonProject1\\baidu_img.png")

driver.quit()

腳本運(yùn)行完成后打設(shè)置的截圖保存的路徑,就可以找到baidu_img.png圖片文件了。

關(guān)閉瀏覽器

在前面的例子中我們一直使用quit()方法,其含義為退出相關(guān)的驅(qū)動程序和關(guān)閉所有窗口。除此之外,WebDriver還提供了close()方法,用來關(guān)閉當(dāng)前窗口。多窗口的處理,在用例執(zhí)行的過程中打開了多個窗口,我們想要關(guān)閉其中的某個窗口,這時就要用到close()方法進(jìn)行關(guān)閉了。

close() 關(guān)閉單個窗口

quit() 關(guān)閉所有窗口

?這是我整理的《2024最新Python自動化測試全套教程》,以及配套的接口文檔/項目實(shí)戰(zhàn)【網(wǎng)盤資源】,需要的朋友可以下方視頻的置頂評論獲取。肯定會給你帶來幫助和方向。

【已更新】B站講的最詳細(xì)的Python接口自動化測試實(shí)戰(zhàn)教程全集(實(shí)戰(zhàn)最新版)

http://m.aloenet.com.cn/news/29579.html

相關(guān)文章:

  • 購物網(wǎng)站的英文app推廣接單渠道
  • 自己建個網(wǎng)站做優(yōu)化百度云盤資源搜索
  • 電子商城網(wǎng)站開發(fā)品牌推廣的三個階段
  • 網(wǎng)站開發(fā)及維護(hù)合同網(wǎng)站免費(fèi)制作
  • 女生學(xué)電子商務(wù)專業(yè)好嗎seo推廣排名公司
  • 西安做行業(yè)平臺網(wǎng)站的公司重慶百度快照優(yōu)化
  • wordpress 目錄安全seo教學(xué)培訓(xùn)
  • 北海教網(wǎng)站建設(shè)全網(wǎng)營銷整合營銷
  • 免費(fèi)空間網(wǎng)站怎么做出來的上海關(guān)鍵詞自動排名
  • wordpress 已登錄用戶登錄seo是指搜索引擎優(yōu)化
  • 甘肅最新消息今天seo優(yōu)化顧問
  • 設(shè)計案例分享網(wǎng)站搜索引擎優(yōu)化包括哪些內(nèi)容
  • h5移動端網(wǎng)站開發(fā)最有效的宣傳方式
  • 新開傳奇網(wǎng)站999新服網(wǎng)百度正版下載恢復(fù)百度
  • 美國做ppt的網(wǎng)站百度競價排名榜
  • 貴州專業(yè)網(wǎng)站建設(shè)公司哪家好湖南seo優(yōu)化哪家好
  • 新疆建網(wǎng)站程序站外推廣
  • 正規(guī)網(wǎng)店代運(yùn)營公司seo每日
  • 豆瓣網(wǎng)站模板滕州今日頭條新聞
  • 自己的電腦做網(wǎng)站服務(wù)器seo的五個步驟
  • 找人做網(wǎng)站協(xié)議網(wǎng)站在線優(yōu)化檢測
  • 專業(yè)網(wǎng)站優(yōu)化外包百度seo推廣計劃類型包括
  • 怎么學(xué)做淘寶電商網(wǎng)站嗎關(guān)鍵詞搜索排行榜
  • html5 公眾號 網(wǎng)站開發(fā)百度seo優(yōu)化價格
  • 專業(yè)做根雕的網(wǎng)站廣州百度搜索優(yōu)化
  • 備案的網(wǎng)站名稱寫什么深圳整站全網(wǎng)推廣
  • 大眾點(diǎn)評怎么做團(tuán)購網(wǎng)站廣告軟文外鏈平臺
  • 做網(wǎng)站需要數(shù)據(jù)儲存么深圳網(wǎng)站設(shè)計三把火
  • 做網(wǎng)站十大公司哪家好短視頻推廣渠道
  • 92素材網(wǎng)安卓優(yōu)化大師官網(wǎng)