web端自動化基礎(chǔ)篇Web自動化測試進(jìn)階

一、認(rèn)識web自動化測試

  1. 什么是自動化測試?
  2. 了解為什么要進(jìn)行自動化測試?
  3. 掌握自動化測試的分類?
  4. web自動化測試的使用條件和場景
  5. 自動化測試工具的優(yōu)缺點
  6. 自動化測試的前景和發(fā)展方向

1.1 什么是自動化測試

首先比較一下手動和自動:
手動操作如下:

image

自動操作如下:
http://n1.itc.cn/img8/wb/sohulife/2016/02/24/145626026613873378.GIF

1.1.1 自動化測試的概念

軟件自動化測試就是通過測試工具或者其他手段,按照測試人員的預(yù)定計劃對軟件產(chǎn)品進(jìn)行自動化測試,他是軟件測試的一個重要組成部分,能夠 完成許多手工測試無法完成或者難以實現(xiàn)的測試工作,正確合理的實施自動化測試,能夠快速,全面的對軟件進(jìn)行測試,從而提高軟件質(zhì)量,節(jié)省經(jīng)費(fèi),縮短軟件的發(fā)布周期。

1.1.2 自動化測試的歷史

  1. 自動化測試就是任何利用工具來輔助的測試,幾乎在計算機(jī)工業(yè)產(chǎn)生的第一天,這種測試就出現(xiàn)了。
  2. 歷史上從來沒有出現(xiàn)過“測試自動化取代測試工程師工作”這種事情發(fā)生,除非你完全忽略測試人員們的真正工作。
  3. 測試自動化意味著使用測試工具。自動化測試是個古老的理念。

1.2 為什么要進(jìn)行自動化測試

1.2.1 自動化測試的好處

  1. 縮短測試周期
    計算機(jī)行業(yè)更新迭代快速,大量頻繁的回歸測試消耗時間,自動化測試能夠?qū)⒅貜?fù)的實行交給計算機(jī)去做,加快測試速度。
  2. 避免人為出錯
    測試人員不可能持續(xù)高度集中,并且人類易受外界影響(頭疼腦熱,精神不振),可能會造成人為錯誤
  3. 測試信息存儲
    自動化測試將測試信息和數(shù)據(jù)儲存在文件中,思路清晰明確,交接方便
  4. 輕易獲取覆蓋率
    自動化測試能夠解放測試人員,使測試人員能夠有更多的精力做那些非重復(fù)性的工作。
  5. 其他
    自動化測試可以是實現(xiàn)自動或者定時執(zhí)行
    注意:自動化測試的方向是對的,而且趨勢也是如此,但是有些自動化實現(xiàn)不了的還是會手動測試的。

1.3 自動化測試的分類

  1. 整體分類
    1)自動化功能測試
    2)自動化性能測試
  2. 自動化功能測試的分類:
1)單元測試:程序員搞定
2)功能測試
3)接口測試:大中型項目或長期項目可以采用自動化測試

性能測試主要是使用測試工具

Loadrunner、Jmeter等,對軟件進(jìn)行壓力測試、負(fù)載測試等等,因為這些無法用手工進(jìn)行代替,所以必須自動化。
為了測試一個web站點的服務(wù)能力,需要模擬上千上萬的請求(比如打開瀏覽器訪問站點),人的速度是遠(yuǎn)遠(yuǎn)達(dá)不到這樣的操作的

1.4 web自動化條件和使用范圍

1.使用自動化的前提條件

1)手動測試已經(jīng)完成,后期再不影響進(jìn)度的前提下逐漸實現(xiàn)自動化
2)項目周期長,重復(fù)性的工作都交給機(jī)器去實現(xiàn)
3)需求穩(wěn)定,項目變動不大
4)自動化測試腳本復(fù)雜度比較低
5)可重復(fù)利用

2.使用自動化測試的場景

1)頻繁的回歸測試
2)冒煙測試
3)傳統(tǒng)行業(yè)需求變化不大,應(yīng)用頻繁
4)性能測試

1.5 web自動化常用的工具

常見的自動化web測試工具

QTP(收費(fèi))

QTP是Mercury公司的Quick Test Professional的簡稱,是一種自動測試工具。

Selenium(開源)

Selenium一個強(qiáng)大的基于瀏覽器的開源自動化測試工具,通常用來編寫web應(yīng)用的自動化測試

RFT(收費(fèi))

IBM Rational Test Professional的簡稱,是一款先進(jìn)的自動化的功能和回歸測試工具,使用與測試人員和GUI開發(fā)人員,基礎(chǔ)是針對Java,.NET的對象計數(shù)和基于web應(yīng)用程序的錄制,回放功能。

1.6 元素的定位

為什么要學(xué)習(xí)定位元素?
環(huán)境及工具
css選擇器
xpath路徑表達(dá)式

1.6.1 為什么要學(xué)習(xí)元素定位?

1)計算機(jī)沒有智能到人的程度。
2)計算機(jī)不能像手動測試人員一樣通過眼看,手操作鼠標(biāo)點擊,操作鍵盤輸入。
3)計算機(jī)通過一系列計數(shù)手段找到元素(按鈕、輸入框、模擬鍵盤等)

1.6.2 元素定位的工具或手段有哪些?

1)css選擇器
2)xpath

1.6.3 環(huán)境及工具

材料

1)firefox35
2)firebug插件
3)firepath插件

安裝步驟

參考瀏覽器安裝文檔

1.7 xpath

1.7.1 什么是xpath?

XPath即為XML路徑語言,它是一種用來(標(biāo)準(zhǔn)通用標(biāo)記語言的子集)在 HTML\XML 文檔中查找信息的語言。
W3School官方文檔:http://www.w3school.com.cn/xpath/index.asp

1.7.2 什么是XML?

XML 指可擴(kuò)展標(biāo)記語言(EXtensible Markup Language)
XML 是一種標(biāo)記語言,很類似 HTML
XML 的設(shè)計宗旨是傳輸數(shù)據(jù),而非顯示數(shù)據(jù)

1.7.3 XML與HTML

image

1.7.4 節(jié)點

節(jié)點的概念:每個XML/HTML的標(biāo)簽我們都稱之為節(jié)點

image
image

1.7.5 獲取元素

XPath 使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點或者節(jié)點集。這些路徑表達(dá)式和我們在常規(guī)的電腦文件系統(tǒng)中看到的表達(dá)式非常相似。

image
/             根節(jié)點
//title      全局模糊定位title
//head/.  定位head元素
//haad/.. 定位head元素的父元素 
//meta[@conent]       
//meta[@conent=""]         

  • 查找某個特定的節(jié)點或者包含某個指定的值的節(jié)點

    image
/html/head/meta[1]

  • 選擇未知節(jié)點

    image
  • 選取若干路徑

    image
    image

1.8 css選擇器

1.8.1 什么是css選擇器?

CSS 中,選擇器是一種模式,用于選擇需要添加樣式的元素。計算機(jī)能夠通過css選擇器定位到相應(yīng)元素,我們在編寫自動化測試腳本的時候很多時候是在不斷地找到css選擇器。

1.8.2 css選擇器語法

1)通過偽類名、id、標(biāo)簽名定位

image

測試站點: http://www.baidu.com
2)通過元素之前嵌套關(guān)系

image

測試:Form span
3)通過屬性

image
image

4)通過父子關(guān)系

image

Web自動化測試進(jìn)階

1. 什么是框架

框架(framework)是一個框子 -- 指其約束性,也是一個架子 -- 指其支撐性,是一個基本概念上的結(jié)構(gòu),用于去解決或者處理復(fù)雜的問題。

框架是整個或部分系統(tǒng)的可重用設(shè)計,表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實例間交互的方法;另一種定義認(rèn)為,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架。前者是從應(yīng)用方面而后者是從目的方面給出的定義。

框架,其實就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡單說就是使用別人搭好的舞臺,你來做表演。

2. 為什么使用框架

1)自己從頭實現(xiàn)太復(fù)雜
2)使用框架能夠更專注于業(yè)務(wù)邏輯,加快開發(fā)速度
3)框架的使用能夠處理更多細(xì)節(jié)問題
4)使用人數(shù)多,穩(wěn)定性,擴(kuò)展性好

3. selenium工作原理

image

4. selenium環(huán)境搭建

1)python3.7
2)Firefox35(大于43)
3)selenium2框架
穩(wěn)定版 2.48.0 (pip install selenium==2.48.0)
4)瀏覽器驅(qū)動
下載谷歌驅(qū)動
selenium之 chromedriver與chrome版本映射表
Firefox瀏覽器對應(yīng)各個版本驅(qū)動下載地址
firefox各個版本安裝包的下載地址
注意:Firefox35(大于43)版本不需要下載驅(qū)動器,大于這個版本的需要,Chrome需要下載驅(qū)動器,下邊分別演示。

5. selenium對瀏覽器操作

1)庫的導(dǎo)入

from selenium import webdriver

2)創(chuàng)建瀏覽器對象
driver = webdriver.xxx()
使用dir(driver)查看方法

# 必須為大寫
driver = webdriver.Firefox()
driver = webdriver.Chrome()

3)瀏覽器尺寸相關(guān)操作

maximize_window()     最大化
get_window_size()     獲取瀏覽器尺寸,打印查看
set_window_size()     設(shè)置瀏覽器尺寸,400*400

4)瀏覽器位置相關(guān)操作

get_window_position()     獲取瀏覽器位置
set_window_position(x,y)     設(shè)置瀏覽器位置

注意:顯示器以左上角為(0,0),所有的位置操作都是相對于顯示器左上角展開的位移操作,單位是像素。
5)瀏覽器的關(guān)閉操作

close()     關(guān)閉當(dāng)前標(biāo)簽/窗口
quit()     關(guān)閉所有標(biāo)簽/窗口

6)頁面請求操作

driver.get(url)    請求某個url對應(yīng)的響應(yīng)
refresh()     刷新頁面操作
back()      回退到之前的頁面
forward()     前進(jìn)到之后的頁面

  • 案例
from selenium import webdriver
import time

# driver = webdriver.Chrome()#不可以找到,必須導(dǎo)入對應(yīng)的驅(qū)動器
driver = webdriver.Firefox()
url1 = "http://www.baidu.com"
url2 = "https://zhuanlan.zhihu.com/"
# 請求第一個接口
driver.get(url1)
time.sleep(3)
# 刷新
driver.refresh()
driver.get(url2)
# 回退
driver.back()
time.sleep(3)
# 前進(jìn)
driver.forward()
time.sleep(3)
driver.close()

6. selenium獲取斷言信息

6.1 什么是斷言

斷言是編程術(shù)語,表示為一些布爾表達(dá)式,程序員相信在程序中的某個特定點該表達(dá)式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言而在部署時禁用斷言。

6.2 獲取斷言信息的操作

  • current_url 獲取當(dāng)前訪問頁面url
  • title 獲取當(dāng)前瀏覽器標(biāo)題
  • page_source 獲取網(wǎng)頁源碼
print(driver.current_url)
print(driver.title)
print(driver.page_source)

  • get_screenshot_as_png() 保存圖片
data = driver.get_screenshot_as_png()
with open("a.png", "wb") as f:
    f.write(data)

image
  • get_screenshot_as_file(file) 直接保存
driver.get_screenshot_as_file("b.png")

7. selenium八大元素定位

from selenium import webdriver
driver = webdriver.Firefox()

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

# 第一種
# ele = driver.find_element_by_id("kw")
# ele.send_keys(12306)   # 輸入數(shù)據(jù)

# from selenium.webdriver.common.by import By
# ele = driver.find_element(By.ID,"kw")
# ele.send_keys(12306)   # 輸入數(shù)據(jù)

# 第二種
# ele = driver.find_element_by_name("wd")
# ele.send_keys(12306)   # 輸入數(shù)據(jù)

# 第三種
# ele = driver.find_element_by_class_name("s_ipt")
# ele.send_keys(12306)   # 輸入數(shù)據(jù)

# 第四種
# ele = driver.find_element_by_xpath("http://*[@id='kw']")
# ele.send_keys(12306)   # 輸入數(shù)據(jù)

# 第五種
# ele = driver.find_element_by_css_selector("#kw")
# ele.send_keys(12306)   # 輸入數(shù)據(jù)

# 第六種
# ele = driver.find_element_by_link_text("地圖")
# ele.click()   # 輸入數(shù)據(jù)

# 第七種:類似于模糊匹配
# ele = driver.find_element_by_partial_link_text("地")
# ele.click()

# 第八種:標(biāo)簽名定位,必須得保證只有一個這種名字的標(biāo)簽,使用下面這個搜索
# url = "http://cn.bing.com/"
# driver.get(url)
# ele = driver.find_element_by_tag_name("input")
# ele.send_keys(12306)   # 輸入數(shù)據(jù)

8. 元素的操作

對元素的相關(guān)操作,一般要先獲取到元素,再調(diào)用相關(guān)方法
element = driver.find_element_by_xxx(value)
1)點擊和輸入
點擊操作---------->element.click()
清空/輸入操作:
element.clear()---------------------->清空輸入框
element.send_keys(data)-------->輸入數(shù)據(jù)

  • 案例
1.打開百度搜索        
2.搜索關(guān)鍵字 selenium        
3.清空            
4.搜索python

2)提交操作
element.submit()

9. 多標(biāo)簽之間的切換

場景:有的時候點擊一個鏈接,新頁面并非由當(dāng)前頁面跳轉(zhuǎn)過去,而是新開一個頁面打開,這種情況下,計算機(jī)需要識別多標(biāo)簽或窗口的情況。
1)獲取所以窗口的句柄
handles = driver.window_handlers
調(diào)用該方法會得到一個列表,在selenium運(yùn)行過程中的每一個窗口都有一個對應(yīng)的值存放在里面。
2)通過窗口的句柄進(jìn)入的窗口
driver.switch_to_window(handles[n])
driver.switch_to.window(handles[n])
通過窗口句柄激活進(jìn)入某一窗口

driver.get("http://bj.58.com")
ele = driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")
ele.click()
# 直接報錯,原因是需要句柄
eleDaxing = driver.find_element_by_link_text("大興")
eleDaxing.click()

# 使用句柄
driver.get("http://bj.58.com")
print("點擊之前句柄:", driver.window_handles)
ele = driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")
ele.click()
list_windowns = driver.window_handles
print("點擊之后句柄:", driver.window_handles)
driver.switch_to.window(list_windowns[1])
eleDaxing = driver.find_element_by_link_text("大興")
eleDaxing.click()

10. 多表單切換

在網(wǎng)頁中,表單嵌套是很常見的情況,尤其是在登錄的場景

10.1 什么是多表單

實際上就是使用iframe/frame,引用了其他頁面的鏈接,真正的頁面數(shù)據(jù)并沒有出現(xiàn)在當(dāng)前源碼中,但是在瀏覽器中我們看到,簡單理解可以使頁面中開了一個窗口顯示另一個頁面

10.2 處理方法

直接使用id值切換進(jìn)表單
driver.switch_to.frame(value)/driver.switch_to_frame(value)
定位到表單元素,再切換進(jìn)入
el = driver.find_element_by_xxx(value)
driver.switch_to.frame(el)/driver.switch_to_frame(el)

from selenium import  webdriver
#打開游覽器
driver = webdriver.Firefox()
#登錄QQ
url = "https://qzone.qq.com/"
driver.get(url)
#獲取元素
#定位表單元素
ele_bd = driver.find_element_by_id("login_frame")
driver.switch_to.frame(ele_bd)
ele = driver.find_element_by_xpath(".//*[@id='switcher_plogin']")
ele.click()
#輸入賬號
ele2 = driver.find_element_by_id("u")
ele2.send_keys()
#輸入密碼
ele3 = driver.find_element_by_id("p")
ele3.send_keys("")

ele4 = driver.find_element_by_id("login_button")
ele4.click()

11. 彈出框操作

  1. 進(jìn)入到彈出框中
    driver.switch_to.alert
  2. 接收警告
    accept()
  3. 解散警告
    dismiss()
    發(fā)送文本到警告框
    send_keys(data)
    用法:driver.switch_to.alert.accept()
  • 案例:
from selenium import  webdriver
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
ele_setting = driver.find_element_by_id("s-usersetting-top")
ele_setting.click()
ele_gaoji = driver.find_element_by_class_name("setpref")
ele_gaoji.click()
ele_save = driver.find_element_by_class_name("prefpanelgo")
ele_save.click()
driver.switch_to.alert.accept()

12.下拉框

from selenium import  webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
ele = driver.find_element_by_id("s-usersetting-top")
ele.click()
ele1 = driver.find_element_by_xpath(".//*[@id='s-user-setting-menu']/div/a[2]")
ele1.click()
time.sleep(2)
ele2 = driver.find_element_by_xpath(".//*[@id='yadv-setting-gpc']/div/div[1]/i[1]")
ele2.click()
list_ele = driver.find_elements_by_class_name("c-select-item")
print(list_ele)
list_ele[2].click()
# for list_i in list_ele:
#     print(list_i.text)
#     if list_i.text =="最近一周":
#         list_i.click()

13. 鼠標(biāo)和鍵盤操作

手動測試時鍵盤的操作在selenium頁有實現(xiàn),關(guān)于鼠標(biāo)的操作由ActionChains()類來提供,關(guān)于鍵盤的操作由Key()類來提供
1)鼠標(biāo)操作

  • 導(dǎo)入動作鏈類,動作鏈可以儲存鼠標(biāo)的動作,并一起執(zhí)行
from selenium.webdriver import ActionChains
ActionChains(driver)

  • 鼠標(biāo)右擊
el = driver.find_element_by_xxx(value)
context_click(el)

對el執(zhí)行右擊

  • 執(zhí)行ActionChains中儲存的所有動作
perform()

  • 常用鼠標(biāo)動作:
ActionChains(driver).context_click(ele).perform()        點擊鼠標(biāo)右鍵      
ActionChains(driver). double_click(ele).perform()        點擊鼠標(biāo)左鍵
ActionChains(driver).move_to_element(el).perform() 鼠標(biāo)懸停

  • 案例
from selenium.webdriver import ActionChains
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
ele = driver.find_element_by_xpath(".//*[@id='s-top-left']/div/a")
# ele.click()
ActionChains(driver).double_click(ele).perform()

2)鍵盤操作
鍵盤操作使用的是Keys類,一般配合send_keys使用

  • 導(dǎo)入

    from selenium.webdriver.common.keys import 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(chǎn)’)   全選(Ctrl+A)
    send_keys(Keys.CONTROL,‘a(chǎn)’)   全選(Ctrl+A)
    send_keys(Keys.CONTROL,‘x’)   剪切(Ctrl+X)
    send_keys(Keys.CONTROL,‘v’)   粘貼(Ctrl+V)
    send_keys(Keys.F1)            鍵盤 F1
    send_keys(Keys.F12)           鍵盤 F12
    
    

14. 瀏覽器等待

1) 為什么要進(jìn)行等待?
1.網(wǎng)速慢
2.網(wǎng)站內(nèi)容過多
3.如果不進(jìn)行等待而直接定位元素,可能會拋出異常
2) selenium中等待的分類:

  1. 顯示等待
    顯示等待是根據(jù)條件進(jìn)行等待,等待條件出現(xiàn)
    實現(xiàn):
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

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

  • 案例
WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(
(By.CLASS_NAME,"g-hu")))

  • 思考:顯示等待與time的區(qū)別?
  1. 隱式等待
    隱式等待是根據(jù)是件進(jìn)行等待,等待特定時間

    driver.implicitly_wait(n)
    
    

    n的單位為秒,n為最大值,在這個最大值內(nèi)只要該界面上的全部元素都加載完成定就結(jié)束沒有加載出元素就拋出 NosuchException.
    注意:優(yōu)先隱式等待,次之顯式等待,最次固定等待

15. 練習(xí)

  1. 使用游覽器登錄http://www.baidu.com
  2. 搜索淘寶官網(wǎng)
  3. 登錄用戶名和密碼
  4. 搜索商品(手機(jī),電腦,,,,),給定約束條件(價格,包郵,發(fā)貨地址。。。)
  5. 將商品添加到購物車
  6. 在購物中游覽該商品
  7. 根據(jù)自己的喜好進(jìn)行下面的操作

16. 2.IDE功能簡介

image
  1. 文件:創(chuàng)建、打開和保存測試案例和測試案例集。編輯:復(fù)制、粘貼、刪除、撤銷和選擇測試案例中的所有命令。Options : 用于設(shè)置seleniunm IDE。
  2. 用來填寫被測網(wǎng)站的地址。
  3. 速度控制:控制案例的運(yùn)行速度。
  4. 運(yùn)行所有:運(yùn)行一個測試案例集中的所有案例。
  5. 運(yùn)行:運(yùn)行當(dāng)前選定的測試案例。
  6. 暫停/恢復(fù):暫停和恢復(fù)測試案例執(zhí)行。
  7. 單步:可以運(yùn)行一個案例中的一行命令。
  8. 錄制:點擊之后,開始記錄你對瀏覽器的操作。
  9. 案例集列表。
  10. 測試腳本;table標(biāo)簽:用表格形式展現(xiàn)命令及參數(shù)。source標(biāo)簽:用原始方式展現(xiàn),默認(rèn)是HTML語言格式,也可以用其他語言展示。
  11. 查看腳本運(yùn)行通過/失敗的個數(shù)。
  12. 當(dāng)選中前命令對應(yīng)參數(shù)。
  13. 日志/參考/UI元素/Rollup
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

class Qq(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(30)
        self.base_url = "https://qzone.qq.com/"
        self.verificationErrors = []
        self.accept_next_alert = True

    def test_qq(self):
        driver = self.driver
        driver.get(self.base_url + "/")
        # ERROR: Caught exception [ERROR: Unsupported command [selectFrame | login_frame;login_href=https%3A%2F%2Fxui.ptlogin2.qq.com%2Fcgi-bin%2Fxlogin%3Fproxy_url%3Dhttps%253A%2F%2Fqzs.qq.com%2Fqzone%2Fv6%2Fportal%2Fproxy.html%26daid%3D5%26%26hide_title_bar%3D1%26low_login%3D0%26qlogin_auto_login%3D1%26no_verifyimg%3D1%26link_target%3Dblank%26appid%3D549000912%26style%3D22%26target%3Dself%26s_url%3Dhttps%253A%252F%252Fqzs.qq.com%252Fqzone%252Fv5%252Floginsucc.html%253Fpara%253Dizone%26pt_qr_app%3D%25E6%2589%258B%25E6%259C%25BAQQ%25E7%25A9%25BA%25E9%2597%25B4%26pt_qr_link%3Dhttps%253A%2F%2Fz.qzone.com%2Fdownload.html%26self_regurl%3Dhttps%253A%2F%2Fqzs.qq.com%2Fqzone%2Fv6%2Freg%2Findex.html%26pt_qr_help_link%3Dhttps%253A%2F%2Fz.qzone.com%2Fdownload.html%26pt_no_auth%3D0 | ]]
        driver.switch_to.frame(driver.find_element_by_id("login_frame"))
        driver.find_element_by_id("switcher_plogin").click()
        # driver.find_element_by_id("uin_del").click()
        driver.find_element_by_id("u").clear()
        driver.find_element_by_id("u").send_keys("3084761668")
        driver.find_element_by_id("p").clear()
        driver.find_element_by_id("p").send_keys("dafei123457")
        driver.find_element_by_id("login_button").click()
        # ERROR: Caught exception [ERROR: Unsupported command [selectWindow | null | ]]
        # driver.find_element_by_id("tcaptcha_drag_thumb").click()

        # self.assertEqual(driver.title,"QQ空間")
        self.assertIn("QQ11空間",driver.title)
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True

    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True

    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內(nèi)容