python selenium span内容读取_【程仁智推荐】Selenium自动化测试入门
LupuX?2017-06-18 14:24:28??11853??收藏?41
分類(lèi)專(zhuān)欄:?Auto Test?文章標(biāo)簽:?自動(dòng)化測(cè)試?selenium?web測(cè)試?UI自動(dòng)化
版權(quán)
一、什么是Selenium
Selenium 是一個(gè)瀏覽器自動(dòng)化測(cè)試框架,它主要用于web應(yīng)用程序的自動(dòng)化測(cè)試,其主要特點(diǎn)如下:開(kāi)源、免費(fèi);多平臺(tái)、瀏覽器、多語(yǔ)言支持;對(duì)web頁(yè)面有良好的支持;API簡(jiǎn)單靈活易于使用;支持分布式測(cè)試用例執(zhí)行。?
Selenium經(jīng)歷了兩個(gè)版本,Selenium1.0和2.0,Selenium1.0主要由以下幾部分構(gòu)成:
Selenium IDE:是一個(gè)嵌入到Firefox中的插件,可以實(shí)現(xiàn)瀏覽器的錄制于回放功能。
Selenium Grid:自動(dòng)化測(cè)試輔助工具,可以很方便地同時(shí)在多臺(tái)機(jī)器上并行運(yùn)行多個(gè)測(cè)試事例。
Selenium RC:是Selenium的核心工具,支持多種不同的語(yǔ)言編寫(xiě)的測(cè)試腳本,通過(guò)Selenium RC的服務(wù)器作為代理服務(wù)器去訪問(wèn)應(yīng)用從而達(dá)到測(cè)試的目的。主要分為以下兩部分:
明白了Selenium1.0的家族關(guān)系,Selenium2.0可以簡(jiǎn)單的認(rèn)為是將WebDriver加入到了Selenium RC這一部分中去。那么Selenium RC和WebDriver有什么區(qū)別呢?RC和 WebDriver 類(lèi)似,都可以看做是一套操作web頁(yè)面的規(guī)范。當(dāng)然,他們的工作原理不一樣。
Client:用來(lái)編寫(xiě)測(cè)試腳本來(lái)控制Selenium server的庫(kù)。
Server:負(fù)責(zé)控制瀏覽器的行為,包含三部分:Launcher;HttpProxy;Core。
Selenium RC 在瀏覽器中運(yùn)行 JavaScript 應(yīng)用,使用瀏覽器內(nèi)置的 JavaScript 翻譯器來(lái)翻譯和執(zhí)行selenese 命令(Selenium 命令集合) 。
WebDriver 通過(guò)原生瀏覽器支持或者瀏覽器擴(kuò)展直接控制瀏覽器。WebDriver 針對(duì)各個(gè)瀏覽器而開(kāi)發(fā),取代了嵌入到被測(cè) Web 應(yīng)用中的 JavaScript。與瀏覽器的緊密集成支持創(chuàng)建更高級(jí)的測(cè)試,避免了JavaScript 安全模型導(dǎo)致的限制。除了來(lái)自瀏覽器廠商的支持,WebDriver 還利用操作系統(tǒng)級(jí)的調(diào)用模擬用戶(hù)輸入。
以后我們基本都用Selenium2.0來(lái)進(jìn)行學(xué)習(xí)和腳本編寫(xiě),并且選定Python語(yǔ)言作為編寫(xiě)腳本的語(yǔ)言,其實(shí)各種語(yǔ)言編寫(xiě)腳本都大同小異。
二、Selenium環(huán)境搭建
1. 安裝Python
這里暫時(shí)只說(shuō)windows下的。訪問(wèn)Python官網(wǎng):https://www.Python.org/選擇下載Python2或者3系列,直接點(diǎn)擊安裝,注意勾選將其自動(dòng)添加至系統(tǒng)環(huán)境變量中,并且勾選自動(dòng)安裝pip,便于我們直接從cmd中使用。具體步驟不再多說(shuō),網(wǎng)上教程很多。
2. 安裝Selenium
安裝好了Python環(huán)境之后,我們直接用pip install Selenium命令來(lái)安裝Selenium。
3. 安裝瀏覽器驅(qū)動(dòng)
這里我們需要知道的是Firefox的驅(qū)動(dòng)已經(jīng)集成在了Selenium WebDriver包中了,不用我們自己安裝了。下面看一個(gè)簡(jiǎn)單了例子:
#coding=utf-8from Selenium import webdriver
#瀏覽器驅(qū)動(dòng)
driver=webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Selenium2")
driver.find_element_by_id("su").click()
driver.quit()
1
2
3
4
5
6
7
8
9
10
這個(gè)簡(jiǎn)單的例子做的事是:打開(kāi)Firefox,訪問(wèn)百度首頁(yè),輸入Selenium2關(guān)鍵字進(jìn)行搜索,退出。運(yùn)行它,我們可以看見(jiàn)以下頁(yè)面:
如果我們想要使用其他的瀏覽器呢?首先必須要下載響應(yīng)瀏覽器的驅(qū)動(dòng),我們可以訪問(wèn)http://docs.Seleniumhq.org/download/來(lái)下載相關(guān)的驅(qū)動(dòng),并將其放在系統(tǒng)路徑中。比如我們這里把Firefox改為Chrome,再運(yùn)行程序可以看見(jiàn):
4. 其他工具安裝
這里我們主要使用Firefox來(lái)進(jìn)行演示,還需要安裝一些插件來(lái)方便我們后面的控件抓取。可以直接訪問(wèn)https://addons.mozilla.org/zh-CN/firefox/來(lái)搜索和安裝一些插件,比如常用的XPath和Firebug等。
環(huán)境搭建完成以后我們要做的就是開(kāi)始學(xué)習(xí)編寫(xiě)腳本的API了。
三、WebDriver API
本節(jié)的內(nèi)容是,在Python語(yǔ)言中,如何通過(guò)Selenium WebDriver提供的各種方法來(lái)實(shí)現(xiàn)web自動(dòng)化測(cè)試。我們會(huì)學(xué)習(xí)一下各種操作web頁(yè)面的API。這里推薦一個(gè)特別好的寫(xiě)示例Demo用的網(wǎng)站http://sahitest.com/demo/index.htm,它里面基本可以找到我們需要的所有場(chǎng)景。
1. 定位元素
通過(guò)firebug等工具我們可以看見(jiàn)頁(yè)面上的各種元素,如下圖:
每個(gè)元素都有不同的標(biāo)簽名和屬性名等,Selenium可以通過(guò)這些來(lái)定位元素。在WebDriver中有以下定位元素的方法:
id
name
class name
tag name
link text
partial link text
XPath
css selector
對(duì)應(yīng)的在Python中定位的方法如下:?
find_element _by_id()?
find_element _by_name()?
…?
等等八種方式(僅僅更換了關(guān)鍵字)。
上面這些定位方式除了最后兩種外,我們只需要看它的名字就很明顯可以知道,它到底是怎么定位的。但是有個(gè)問(wèn)題是?我們?cè)趺吹玫竭@些屬性,可以看見(jiàn)即使通過(guò)firebug或查看源碼去觀察元素時(shí),也是比較麻煩和不直觀的。這里我們就要用到最后這兩種強(qiáng)大的工具了。
XPath定位:
在前面我們說(shuō)到了安裝XPath工具,如果安裝成功了之后,在一個(gè)網(wǎng)頁(yè)的任意位置,單擊右鍵可以看到以下頁(yè)面:
通過(guò)firebug可以看出來(lái)一些元素的屬性等信息,如以下片段是搜索框和按鈕的信息:
<span class="bg s_ipt_wr quickdelete-wrap"><span class="soutu-btn">span>
<input id="kw" class="s_ipt" name="wd" value="" maxlength="255" autocomplete="off">
<a id="quickdelete" class="quickdelete" href="javascript:;" title="清空" style="top: 0px; right: 0px; display: none;">a>
span>
<span class="bg s_btn_wr">
<input id="su" class="bg s_btn" value="百度一下" type="submit">
span>
1
2
3
4
5
6
7
8
圖中我們是在百度搜索的搜索框中點(diǎn)擊了右鍵,選中XPaths之后,可以看到顯示出了很多種定位此元素的方法,從中我們也可以得到此元素的各種信息。這時(shí)在相應(yīng)的方法上單擊右鍵或左鍵就可以將其復(fù)制下來(lái)。
使用絕對(duì)路徑定位?很顯然我們要定位一個(gè)元素的話,可以從第一層一直往下找,最終一定會(huì)找到這個(gè)元素的:
可以從上圖看到,如果想定位到搜索框的話,采用絕對(duì)路徑定位的話,其層級(jí)有十層之多,太煩人類(lèi)了!
使用元素屬性定位?我們來(lái)分析一下這種格式,比如//input[@id='kw'],如果要在腳本中使用的話,應(yīng)該是find_element_by_xpath("//input[@id='kw']"),這里的//表示當(dāng)前頁(yè)面的某個(gè)目錄下,input表示定位元素的標(biāo)簽名,[@id=’kw’]表示這個(gè)元素的id屬性值為kw。同理我們還可以用其他的屬性值來(lái)定位,如name、class,元素的任意屬性值都可以用,只要它可以標(biāo)識(shí)唯一的一個(gè)元素。?
如果屬性有重復(fù)的話,可以使用邏輯運(yùn)算符來(lái)連接多個(gè)屬性從而區(qū)別其他屬性。比如:find_element_by_xpath("//input[@id='kw' and @name='wd']")。
CSS選擇器定位
css選擇器可以方便的選擇控件的任意屬性,一般情況下比XPath速度要快,但是有一定的學(xué)習(xí)成本。可以訪問(wèn)http://www.w3school.com.cn/cssref/css_selectors.asp來(lái)獲取css選擇器的所有使用方式。部分語(yǔ)法如下:
根據(jù)以上語(yǔ)法,我們可以使用
driver.find_element_by_css_selector("#kw")driver.find_element_by_css_selector(".s_ipt")
driver.find_element_by_css_selector("map>area")
1
2
3
等等方式來(lái)定位元素。可以使用如下方式得到CSS層級(jí):
復(fù)制之后,粘貼出來(lái)可以看到如下字符串:
html body div#wrapper div#head div.head_wrapper div.s_form div.s_form_wrapper.soutu-env-nomac.soutu-env-index div#lg map area1
可以得到規(guī)律:層級(jí)之間用空格分隔,元素定位的方式會(huì)展示出來(lái)。(如,使用標(biāo)簽名的html、使用class的div.s_form、使用id的div#lg等等)所以我們上面可以使用map>area(父標(biāo)簽>子標(biāo)簽)來(lái)定位百度首頁(yè)那張圖片的位置。
關(guān)于更多CSS選擇器的用法不做更多的解釋了,可以查看官方文檔等方式來(lái)查看使用方法!我們可以熟練的使用XPath或CSS選擇器中的一種,就可以解決大部分定位的問(wèn)題了。
2. 控制瀏覽器
控制瀏覽器窗口大小:
driver=webdriver.Firefox()#設(shè)置窗口大小為x,y
driver.set_window_size(x,y)
#最大化窗口
driver.maxmize_window()
1
2
3
4
5
控制瀏覽器前進(jìn)后退:?
類(lèi)似于點(diǎn)擊前進(jìn)后退按鈕,實(shí)現(xiàn)頁(yè)面切換。要注意的是,我們打開(kāi)的頁(yè)面是不是新建了一個(gè)標(biāo)簽頁(yè),是不是有上級(jí)頁(yè)面可以返回。
driver.get("https://www.baidu.com")
driver.find_element_by_css_selector("div#u1>a.mnav").click()
driver.back()
driver.forward()
1
2
3
4
5
3. 元素操作
當(dāng)我們獲取了元素之后,還要對(duì)其進(jìn)行操作,如點(diǎn)擊按鈕、輸入文字、提交表單等。大多數(shù)頁(yè)面交互的方法通過(guò)WebElement接口提供,常用的有:
clear()?清除文本框中的文本?send_keys(*value)?模擬按鍵輸入?click()?單擊元素
這幾個(gè)方法很簡(jiǎn)單,很方便使用。
submit()?用于提交表單,例如搜索框中的提交按鈕。比如我們可以用如下代碼直接輸入搜索的關(guān)鍵字后用submit()提交,而不用獲取搜索按鈕再點(diǎn)擊。
driver.find_element_by_css_selector("#kw").send_keys("selenium2").submit()1
還有幾個(gè)常用的方法:
size()?獲取元素的大小尺寸?text()獲取元素的文本?is_displayed()元素是否可見(jiàn)
4. 鼠標(biāo)、鍵盤(pán)事件
模擬鼠標(biāo)右鍵、雙擊、懸停、拖拽等操作,會(huì)用到ActionChains類(lèi)。selenium.webdriver.common.action_chains.ActionChains(driver)當(dāng)調(diào)用ActionChains的方法時(shí),不會(huì)立即執(zhí)行,而是會(huì)將所有的操作按順序存放在一個(gè)隊(duì)列里,當(dāng)你調(diào)用perform()方法時(shí),隊(duì)列中的時(shí)間會(huì)依次執(zhí)行。
ActionChains方法列表:
click(on_element=None) ——單擊鼠標(biāo)左鍵click_and_hold(on_element=None) ——點(diǎn)擊鼠標(biāo)左鍵,不松開(kāi)context_click(on_element=None) ——點(diǎn)擊鼠標(biāo)右鍵double_click(on_element=None) ——雙擊鼠標(biāo)左鍵drag_and_drop(source, target) ——拖拽到某個(gè)元素然后松開(kāi)drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某個(gè)坐標(biāo)然后松開(kāi)key_down(value, element=None) ——按下某個(gè)鍵盤(pán)上的鍵key_up(value, element=None) ——松開(kāi)某個(gè)鍵move_by_offset(xoffset, yoffset) ——鼠標(biāo)從當(dāng)前位置移動(dòng)到某個(gè)坐標(biāo)move_to_element(to_element) ——鼠標(biāo)移動(dòng)到某個(gè)元素move_to_element_with_offset(to_element, xoffset, yoffset) ——移到距某個(gè)元素(左上角)多少距離的位置perform() ——執(zhí)行鏈中的所有動(dòng)作release(on_element=None) ——在某個(gè)元素位置松開(kāi)鼠標(biāo)左鍵send_keys(*keys_to_send) ——發(fā)送某個(gè)鍵到當(dāng)前焦點(diǎn)的元素send_keys_to_element(element, *keys_to_send) ——發(fā)送某個(gè)鍵到指定元素1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
這些鼠標(biāo)鍵盤(pán)事件相對(duì)來(lái)說(shuō)用的并不是很多,我們只需要熟練使用最常用的那些,剩下的都差不多。
5. 獲取驗(yàn)證信息
我們?cè)诰帉?xiě)功能測(cè)試用例時(shí),一般會(huì)有預(yù)期結(jié)果,在自動(dòng)化用例執(zhí)行完成之后,我們可以從頁(yè)面上獲取一些信息來(lái)驗(yàn)證用例是執(zhí)行失敗還是成功。最常用的幾種如下:
driver.title -獲取當(dāng)前頁(yè)的titledriver.current_url -獲取當(dāng)前頁(yè)面URL
driver.find_element_by_...(...).text -獲取當(dāng)前控件的text信息
1
2
3
6.設(shè)置等待時(shí)間
顯示等待:?- 主要使用的類(lèi)和方法:WebDriverWait、uitil\until_not、Expected Conditions。?
請(qǐng)看以下簡(jiǎn)單示例:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver=webdriver.Firefox()
driver.get("http://www.qq.com/")
element=WebDriverWait(driver,5,0.5).until(EC.title_is(U"騰訊首頁(yè)"))
print(element)
1
2
3
4
5
6
7
8
9
10
11
這里調(diào)用WebDriverWait來(lái)實(shí)現(xiàn),在默認(rèn)的一段時(shí)間內(nèi),每隔一段時(shí)間檢測(cè)一次當(dāng)前的頁(yè)面指定元素是存在。
WebDriverWait()
如圖所示,WebDriverWait有四個(gè)參數(shù),WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None),分別是:driver;超時(shí)時(shí)間,檢測(cè)間隔;超時(shí)后的異常信息。
until()和until_not()
WebDriverWait()一般和until()或until_not()配合使用,until(method,message=’ ‘) 調(diào)用該方法提供的驅(qū)動(dòng)程序作為一個(gè)參數(shù),直到返回值為true,同理可知道until_not(method,message=’ ‘),調(diào)用該方法提供的驅(qū)動(dòng)程序作為一個(gè)參數(shù),直到返回值應(yīng)該為false。
其中的參數(shù)method,應(yīng)該使用什么方法呢?這里就要用到另一個(gè)常用的類(lèi)了:
expected_conditions
注意,在上面的code中我們用as將其重命名為了EC,這個(gè)類(lèi)有很多種方法可以選用:
可以看到里面有很多的方法可以用來(lái)判斷是否存在相應(yīng)的元素。當(dāng)然這里的method我們也可以用其他的方法,比如:WebDriverWait(driver,5,0.5).until(lambda driver: driver.find_element_by_xpath("//a[@bosszone='news_n']")),用這樣的方式來(lái)判斷是否顯示出了響應(yīng)的元素。
隱式等待:?- implicitly_wait
隱式等待相對(duì)于顯式等待就要簡(jiǎn)單多了,driver.implicitly_wait(n),n代表等待的秒數(shù), 隱式等待相當(dāng)于設(shè)置全局的等待,在定位元素時(shí),對(duì)所有元素設(shè)置超時(shí)時(shí)間,超出了設(shè)置時(shí)間則拋出異常,默認(rèn)是0。如果元素定位不到,則以輪詢(xún)的方式不斷定位,直到超時(shí)時(shí)間到達(dá)。
強(qiáng)制等待-sleep休眠方法:?- Python的time模塊提供,sleep(n),n為秒數(shù)。程序執(zhí)行到這里的時(shí)候,強(qiáng)制暫停所設(shè)置的時(shí)長(zhǎng)。
7. 定位一組元素
在前面我們說(shuō)到了8種定位方法,是對(duì)單元素定位的。WebDriver還提供了與之對(duì)應(yīng)的8種定位方法用于定位一組元素。區(qū)別在于element后面加了一個(gè)s,如下:
find_elements_by_id()find_elements_by_name()
...
1
2
3
一般用于以下場(chǎng)景:
批量操作對(duì)象:如將所有的復(fù)選框選中\(zhòng)取消選中
先獲取一組對(duì)象,然后在這組對(duì)象中過(guò)濾出具體定位的對(duì)象
8. 多表單、多窗口切換
多表單頁(yè)面:如圖所示我們?nèi)绻苯硬僮?#xff0c;去點(diǎn)擊Link Test(frame中的元素),是不可以的,因?yàn)槲覀兪紫刃枰袚Q到這個(gè)frame里面才可以進(jìn)行操作。
通過(guò)firebug工具可以得到此頁(yè)面的源碼,便于我們定位元素:
switch_to_frame(參數(shù))方法,參數(shù)可以是iframe的id、name,如果沒(méi)有的話,也可以傳入locator;switch_to_default_content()方法,用來(lái)返回上一層表單,默認(rèn)與據(jù)它最近的switch_to_frame方法對(duì)應(yīng)。
#coding=utf-8from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://sahitest.com/demo/iframesTest.htm")
#切換到frame里面去
driver.switch_to_frame(driver.find_element_by_xpath("/html/body/iframe"))
#進(jìn)行操作
driver.find_element_by_link_text("Link Test").click()
#退出至上一層表單
driver.switch_to_default_content()
1
2
3
4
5
6
7
8
9
10
11
多窗口切換:如果我們打開(kāi)了多個(gè)窗口,然后想切換到其中的一個(gè)窗口呢?那就要用到switch_to_window這個(gè)方法了,請(qǐng)看如下代碼片段:
driver=webdriver.Firefox()driver.get("http://www.qq.com/")
#獲取qq首頁(yè)窗口句柄
first_windows=driver.current_window_handle
driver.find_element_by_xpath("//a[@bosszone='news_n']").click()
#當(dāng)前所有打開(kāi)的窗口句柄
all_handles=driver.window_handles
#進(jìn)入到首頁(yè)窗口
for handle in all_handles:
if handle==first_windows:
driver.switch_to_window(handle)
print("In first_windows")
#從首頁(yè)打開(kāi)"圖片"頁(yè)
driver.find_element_by_xpath("//a[@bosszone='photo_n']").click()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
9. 警告框處理
在WebDriver中處理js生成的alert、confirm、prompt是很簡(jiǎn)單的,即用switch_to_alert()方法定位到彈出框,再使用text/accept/dismiss/send_keys進(jìn)行操作。看如下代碼片段:
# coding=utf-8from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get("https://www.baidu.com/")
#點(diǎn)擊設(shè)置
driver.find_element_by_css_selector("div#u1 a.pf").click()
#點(diǎn)擊編輯設(shè)置
driver.find_element_by_class_name("setpref").click()
time.sleep(1)
#保存設(shè)置
driver.find_element_by_css_selector("div#gxszButton>a.prefpanelgo").click()
time.sleep(1)
#接收彈窗
driver.switch_to_alert().accept()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
10. 操作滾動(dòng)條&截圖
操作滾動(dòng)條:
可以使用js腳本,拖動(dòng)到指定地方,用?driver.execute_script("arguments[0].scrollIntoView();", target),這個(gè)方法來(lái)拖動(dòng)滾動(dòng)條到指定的地方。其實(shí)元素沒(méi)在一屏,也可以直接定位并點(diǎn)擊的。
# coding=utf-8from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://www.qq.com/")
#定位到“體育社區(qū)”
target = driver.find_element_by_xpath("//a[@href='http://sports.qq.com/fans/']")
#滾動(dòng)到“體育社區(qū)”
driver.execute_script("arguments[0].scrollIntoView();", target)
1
2
3
4
5
6
7
8
9
10
截圖:
截圖操作也很簡(jiǎn)單,使用driver.get_screenshot_as_file(path)即可完成截圖,之后 可以借助PIL模塊來(lái)進(jìn)行各種處理。
11. 其他操作
還有其他一些操作如:上傳下載文件、操作cookie、驗(yàn)證碼的處理等等操作還沒(méi)有用到過(guò),這些用的場(chǎng)景較少并且有的還比較復(fù)雜,用到的時(shí)候再去學(xué)習(xí)就好了。?
熟練使用以上的各部分,可以寫(xiě)出各種常用的腳本,我們算是入門(mén)Selenium了。:)
總結(jié)
以上是生活随笔為你收集整理的python selenium span内容读取_【程仁智推荐】Selenium自动化测试入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 光电转换模块_光模块:PIN光电二极管和
- 下一篇: python上下键不能用_python退