1. 如何進行元素定位突委?
# html頁面由標簽構(gòu)成奋刽,標簽的基本格式如下:
# <標簽名 屬性名1="屬性值1" 屬性名2="屬性值2">文本</標簽名>
示例:
<input id="username" type="text" name="username" placeholder="用戶名" />
<div id="my_cart">
<span>我的購物車</span>
</div>
- 元素定位就是通過元素的信息或元素層級結(jié)構(gòu)來定位元素的。
2. 瀏覽器開發(fā)者工具
瀏覽器開發(fā)者工具就是給專業(yè)的web應用和網(wǎng)站開發(fā)人員使用的工具。 包含了對HTML查看和編 輯潦刃、Javascript控制臺、網(wǎng)絡狀況監(jiān)視等功能懈叹,是開發(fā)JavaScript乖杠、CSS、HTML和Ajax的得力助手澄成。
-
作用:快速定位元素胧洒,查看元素信息
2.1 如何使用瀏覽器開發(fā)者工具
安裝
瀏覽器已默認安裝,可以直接使用
啟動
- 快捷鍵:一般在windows系統(tǒng)上打開瀏覽器開發(fā)者工具都是按F12
- 火狐瀏覽器:在頁面上點擊右鍵選擇‘查看元素’
- 谷歌瀏覽器:在頁面上點擊右鍵選擇‘檢查’
使用
- 方法一:在要查看的元素上點擊右鍵選擇‘查看元素’或者‘檢查’
- 方法二:先打開瀏覽器開發(fā)者工具墨状,點擊選擇元素的圖標卫漫,移動鼠標到要查看的元素,然后點擊
3. 元素定位方式
# Selenium提供了八種定位元素方式
1. id
2. name
3. class_name
4. tag_name
5. link_text
6. partial_link_text
7. XPath
8. CSS
3.1 id定位
說明:id定位就是通過元素的id屬性來定位元素肾砂,HTML規(guī)定id屬性在整個HTML文檔中必須是唯一的列赎;
前提:元素有id屬性
# id定位方法
element = driver.find_element_by_id(id)
3.2 name定位
說明:name定位就是根據(jù)元素name屬性來定位。HTML文檔中name的屬性值是可以重復的镐确。
前提:元素有name屬性
# name定位方法
element = driver.find_element_by_name(name)
3.3 class_name定位
說明:class_name定位就是根據(jù)元素class屬性值來定位元素包吝。HTML通過使用class來定義元素的樣式。
前提:元素有class屬性
注意:如果class有多個屬性值源葫,只能使用其中的一個
# class_name定位方法
element = driver.find_element_by_class_name(class_name)
3.4 tag_name定位
說明:tag_name定位就是通過標簽名來定位诗越;
HTML本質(zhì)就是由不同的tag組成,每一種標簽一般在頁面中會存在多個臼氨,所以不方便進行精確定位掺喻, 一般很少使用
# tag_name定位方法
element = driver.find_element_by_tag_name(tag_name)
- 注意:如果存在多個相同標簽,則返回符合條件的第一個標簽
3.5 link_text定位
說明:link_text定位是專門用來定位超鏈接元素(<a>標簽</a>),并且是通過超鏈接的文本內(nèi)容來定位元素
# link_text定位方法
element = driver.find_element_by_link_text(link_text)
- 注意:link_text:為超鏈接的全部文本內(nèi)容
3.6 partial_link_text定位
說明:partial_link_text定位是對link_text定位的補充感耙,link_text使用全部文本內(nèi)容匹配元素褂乍,
而partial_link_text可以使用局部來匹配元素,也可以使用全部文本內(nèi)容匹配元素即硼。
# partial_link_text定位方法
element = driver.find_element_by_partial_link_text(partial_link_text)
- 注意:partial_link_text:可以傳入a標簽局部文本-能表達唯一性
4. 定位一組元素
4.1 find_elements_by_xxx()
作用:
1). 查找定位所有符合條件的元素
2). 返回的定位元素格式為數(shù)組(列表)格式逃片;
說明:
1). 列表數(shù)據(jù)格式的讀取需要指定下標(下標從0開始)
4.2 示例代碼
driver.find_elements_by_tag_name("input")[1].send_keys("123456")
XPath、CSS定位
1. 什么是XPath只酥?
- XPath即為XML Path的簡稱褥实,它是一門在 XML 文檔中查找元素信息的語言。
- HTML可以看做是XML的一種實現(xiàn)裂允,所以Selenium用戶可以使用這種強大的語言在Web應用中定位元素损离。
XML:一種標記語言,用于數(shù)據(jù)的存儲和傳遞绝编。 后綴.xml結(jié)尾
<?xml version="1.0" encoding="UTF-8" ?>
<node>
<db id="db" desc="三條邊的長度都一樣">
<b1>3</b1>
<b2>3</b2>
<b3>3</b3>
<expect>等邊三角形</expect>
</db>
<dy>
<b1>4</b1>
<b2>4</b2>
<b3>5</b3>
<expect>等腰三角形</expect>
</dy>
</node>
2. XPath定位策略(方式)
- 路徑-定位
- 利用元素屬性-定位
- 屬性與邏輯結(jié)合-定位
- 層級與屬性結(jié)合-定位
XPath定位方法
element = driver.find_element_by_xpath(xpath)
2.1 路徑定位(絕對路徑僻澎、相對路徑)
絕對路徑:從最外層元素到指定元素之間所有經(jīng)過元素層級的路徑
1). 絕對路徑以/html根節(jié)點開始,使用/來分隔元素層級十饥;
如:/html/body/div/fieldset/p[1]/input
2). 絕對路徑對頁面結(jié)構(gòu)要求比較嚴格窟勃,不建議使用
相對路徑:匹配任意層級的元素,不限制元素的位置
1). 相對路徑以//開始
2). 格式://input 或者 //*
2.2 利用元素屬性
說明:通過使用元素的屬性信息來定位元素
格式://input[@id='userA'] 或者 //*[@id='userA']
2.3 屬性與邏輯結(jié)合
說明:解決元素之間個相同屬性重名問題
格式://*[@name='tel' and @class='tel']
2.4 層級與屬性結(jié)合
說明:如果通過元素自身的信息不方便直接定位到該元素逗堵,則可以先定位到其父級元素秉氧,然后再找到該元素
格式://*[@id='p1']/input
2.5 XPath-延伸
//*[text()="xxx"] 文本內(nèi)容是xxx的元素
//*[contains(@attribute,'xxx')] 屬性中含有xxx的元素
//*[starts-with(@attribute,'xxx')] 屬性以xxx開頭的元素
//*[@attribute1=value1 and @attribute2=value2] 同時有兩個屬性值的元素
3. CSS定位
3.1 什么是CSS定位?
- CSS(Cascading Style Sheets)是一種語言蜒秤,它用來描述HTML元素的顯示樣式汁咏;
- 在CSS中,選擇器是一種模式垦藏,用于選擇需要添加樣式的元素梆暖;
- 在Selenium中也可以使用這種選擇器來定位元素伞访。
提示:
- 在selenium中推薦使用CSS定位掂骏,因為它比XPath定位速度要快
CSS定位方法
element = driver.find_element_by_css_selector(css_selector)
3.2 CSS定位常用策略 (方式)
1. id選擇器
2. class選擇器
3. 元素選擇器
4. 屬性選擇器
5. 層級選擇器
id選擇器
說明:根據(jù)元素id屬性來選擇
格式:#id
例如:#userA <選擇id屬性值為userA的元素>
class選擇器
說明:根據(jù)元素class屬性來選擇
格式:.class
例如:.telA <選擇class屬性值為telA的所有元素>
元素選擇器
說明:根據(jù)元素的標簽名選擇
格式:element
例如:input <選擇所有input元素>
屬性選擇器
說明:根據(jù)元素的屬性名和值來選擇
格式:[attribute=value] element[attribute=value]
例如:[type="password"] <選擇type屬性值為password的元素>
層級選擇器
說明:根據(jù)元素的父子關(guān)系來選擇
格式1:element1>element2 通過element1來定位element2,并且element2必須為element1的直接子元素
例如1:p[id='p1']>input <定位指定p元素下的直接子元素input>
格式2:element1 element2 通過element1來定位element2厚掷,并且element2為element1的后代元素
例如2:p[id='p1'] input <定位指定p元素下的后代元素input>
3.3 CSS延伸[了解]
input[type^='p'] type屬性以p字母開頭的元素
input[type$='d'] type屬性以d字母結(jié)束的元素
input[type*='w'] type屬性包含w字母的元素
4. 八種元素定位方式分類-匯總
1. id弟灼、name、class_name:為元素屬性定位
2. tag_name:為元素標簽名稱
3. link_text冒黑、partial_link_text:為超鏈接定位(a標簽)
4. XPath:為元素路徑定位 5. CSS:為CSS選擇器定位
XPath與CSS類似功能對比
定位方式 | XPath | CSS |
---|---|---|
元素名 | //input | input |
id | //input[@id='userA'] | #userA |
class | //*[@class='telA'] | .telA |
屬性 | 1. //*[text()="xxx"] 2. //input[starts-with(@attribute,'xxx')] 3. //input[contains(@attribute,'xxx')] |
1. input[type^='p'] 2. input[type$='d'] 3. input[type*='w'] |
5. 定位元素的另一種寫法--延伸[了解]
方法:find_element(by=By.ID, value=None)
備注:需要兩個參數(shù)田绑,第一個參數(shù)為定位的類型由By提供,第二個參數(shù)為定位的具體方式
示例:
1. driver.find_element(By.CSS_SELECTOR, '#emailA').send_keys("123@126.com")
2. driver.find_element(By.XPATH, '//*[@id="emailA"]').send_keys('234@qq.com')
3. driver.find_element(By.ID, "userA").send_keys("admin")
4. driver.find_element(By.NAME, "passwordA").send_keys("123456")
5. driver.find_element(By.CLASS_NAME, "telA").send_keys("18611111111")
6. driver.find_element(By.TAG_NAME, 'input').send_keys("123")
7. driver.find_element(By.LINK_TEXT, '訪問 新浪 網(wǎng)站').click()
8. driver.find_element(By.PARTIAL_LINK_TEXT, '訪問').click()
5.1 導入By類
# 導包:
from selenium.webdriver.common.by import By
5.2 find_element_by_xxx()和find_element() 區(qū)別
# 說明:通過查看find_element_by_id底層實現(xiàn)方法抡爹,發(fā)現(xiàn)底層是調(diào)用find_element方法進行的封裝掩驱;
元素操作、瀏覽器操作方法
元素常用操作方法
1. click() 單擊元素
2. send_keys(value) 模擬輸入
3. clear() 清除文本
操作瀏覽器常用方法
1. maximize_window() 最大化瀏覽器窗口 --> 模擬瀏覽器最大化按鈕
2. set_window_size(width, height) 設(shè)置瀏覽器窗口大小 --> 設(shè)置瀏覽器寬、高(像素點)
3. set_window_position(x, y) 設(shè)置瀏覽器窗口位置 --> 設(shè)置瀏覽器位置
4. back() 后退 --> 模擬瀏覽器后退按鈕
5. forward() 前進 --> 模擬瀏覽器前進按鈕
6. refresh() 刷新 --> 模擬瀏覽器F5刷新
7. close() 關(guān)閉當前窗口 --> 模擬點擊瀏覽器關(guān)閉按鈕
8. quit() 關(guān)閉瀏覽器驅(qū)動對象 --> 關(guān)閉所有程序啟動的窗口
9. title 獲取頁面title
10. current_url 獲取當前頁面URL
2.2 示例代碼
# 最大化瀏覽器
driver.maximize_window()
# 刷新
driver.refresh()
# 后退
driver.back()
# 前進
driver.forward()
# 設(shè)置瀏覽器大小欧穴,單位像素
driver.set_window_size(300,300)
# 設(shè)置瀏覽器位置
driver.set_window_position(300,200)
# 關(guān)閉當前主窗口(主窗口:默認啟動哪個界面民逼,就是主窗口)
driver.close()
# 關(guān)閉由driver對象啟動的所有窗口
driver.quit()
# 獲取title
title = driver.title
# 獲取當前頁面url
url = driver.current_url
# 提示:
1. driver.title 和 driver.current_url 沒有括號,應用場景:一般為判斷上步操作是否執(zhí)行成功涮帘。
2. driver.maximize_window() # 一般為我的前置代碼拼苍,在獲取driver后,直接編寫最大化瀏覽器
3. driver.refresh() 應用場景调缨,在后面的cookie章節(jié)會使用到疮鲫。
4. driver.close()與driver.quit()區(qū)別:
close():關(guān)閉當前主窗口
quit():關(guān)閉由driver對象啟動的所有窗口
提示:如果當前只有1個窗口,close與quit沒有任何區(qū)別弦叶。
三俊犯、元素信息操作API
3.1 方法:
1). text 獲取元素文本 如:driver.text
2). size 獲取元素大小 如:driver.size
3). get_attribute 獲取元素屬性值 如:driver.get_attribute("id")
4). is_displayed 判斷元素是否可見 如:element.is_displayed()
5). is_enabled 判斷元素是否可用 如: element.is_enabled()
6). is_selected 判斷元素是否被選中 如:element.is_selected()
3.2 提示:
1. text和size調(diào)用時 無括號
2. get_attribute一般應用場景:判斷一組元素是否為想要的元素或者判斷元素屬性值是否正確
3. is_displayed、is_enabled伤哺、is_selected瘫析,在特殊應用場景中使用。
鼠標和鍵盤操作
1. 鼠標操作
常見的鼠標操作有:點擊默责、右擊贬循、雙擊、懸停桃序、拖拽等杖虾,對于這些鼠標操作Selenium都封裝了相應的操作方法。
1.1 為什么要操作鼠標媒熊?
現(xiàn)在Web產(chǎn)品中存在豐富的鼠標交互方式奇适,作為一個Web自動化測試框架,需要應對這些鼠標操作的應用場景芦鳍。
1.2 鼠標操作的方法
說明:在Selenium中將操作鼠標的方法封裝在ActionChains類中
實例化對象:
action = ActionChains(driver)
方法:
1. context_click(element) 右擊 --> 模擬鼠標右鍵點擊效果
2. double_click(element) 雙擊 --> 模擬鼠標雙擊效果
3. drag_and_drop(source, target) 拖動 --> 模擬鼠標拖動效果
4. move_to_element(element) 懸停 --> 模擬鼠標懸停效果
5. perform() 執(zhí)行 --> 此方法用來執(zhí)行以上所有鼠標操作
1.3 鼠標執(zhí)行-perform()
說明:在ActionChains類中所有提供的鼠標事件方法嚷往,在調(diào)用的時候所有的行為都存儲在ActionChains對象中,
而perform()方法就是真正去執(zhí)行所有的鼠標事件。
強調(diào):必須調(diào)用perform()方法才能執(zhí)行鼠標事件
1.4 鼠標右鍵-context_click()
說明:對于點擊鼠標右鍵柠衅,如果彈出的是瀏覽器默認的菜單皮仁,Selenium沒有提供操作菜單選項的方法;
如果是自定義的右鍵菜單菲宴,則可以通過元素定位來操作菜單中的選項贷祈。
代碼實現(xiàn)關(guān)鍵點分析
1. 導包:from selenium.webdriver.common.action_chains import ActionChains
2. 實例化ActionChains對象:action = ActionChains(driver)
3. 調(diào)用右鍵方法:action.context_click(element)
4. 執(zhí)行:action.perform()
1.5 鼠標雙擊-double_click()
說明:模擬雙擊鼠標左鍵操作
1.6 鼠標拖動-drag_and_drop()
說明:模擬鼠標拖動動作,選定拖動源元素釋放到目標元素
拖動關(guān)鍵點分析
1. 源元素 source = driver.find_element_by_id(xxx)
2. 目標元素 target = driver.find_element_by_id(xxx)
3. 調(diào)用方法 action.drag_and_drop(source, target).perform()
1.7 鼠標懸停-move_to_element()
說明: 模擬鼠標懸停在指定的的元素上
2. 鍵盤操作
說明:
1). 模擬鍵盤上一些按鍵或者組合鍵的輸入 如:Ctrl+C 喝峦、Ctrl+V势誊;
2). Selenium中把鍵盤的按鍵都封裝在Keys類中
2.1 Keys類
導包:
from selenium.webdriver.common.keys import Keys
2.2 常用的鍵盤操作
1. send_keys(Keys.BACK_SPACE) 刪除鍵(BackSpace)
2. send_keys(Keys.SPACE) 空格鍵(Space)
3. send_keys(Keys.TAB) 制表鍵(Tab)
4. send_keys(Keys.ESCAPE) 回退鍵(Esc)
5. send_keys(Keys.ENTER) 回車鍵(Enter)
6. send_keys(Keys.CONTROL,'a') 全選(Ctrl+A)
7. send_keys(Keys.CONTROL,'c') 復制(Ctrl+C)
2.3 示例代碼
# 定位用戶名
element = driver.find_element_by_id("userA")
# 輸入用戶名
element.send_keys("admin1")
# 刪除1
element.send_keys(Keys.BACK_SPACE)
# 全選
element.send_keys(Keys.CONTROL, 'a')
# 復制
element.send_keys(Keys.CONTROL, 'c')
# 粘貼
driver.find_element_by_id('passwordA').send_keys(Keys.CONTROL, 'v')
元素等待
1. 元素等待
1.1 什么是元素等待?
概念:在定位頁面元素時如果未找到谣蠢,會在指定時間內(nèi)一直等待的過程
1.2 為什么要設(shè)置元素等待粟耻?
- 網(wǎng)絡速度慢
- 電腦配置低
- 服務器處理請求慢
1.3 元素等待類型
- 隱式等待
- 顯式等待
2. 隱式等待
概念:定位元素時查近,如果能定位到元素則直接返回該元素,不觸發(fā)等待挤忙; 如果不能定位到該元 素嗦嗡,則間隔一段時間后再去定位元素; 如果在達到最大時長時還沒有找到指定元素饭玲,則拋出元素 不存在的異常 NoSuchElementException
2.1 實現(xiàn)方式
方法:
driver.implicitly_wait(timeout)
(timeout:為等待最大時長侥祭,單位:秒)
說明:隱式等待為全局設(shè)置(只需要設(shè)置一次,就會作用于所有元素)
3. 顯式等待
概念:定位指定元素時茄厘,如果能定位到元素則直接返回該元素矮冬,不觸發(fā)等待; 如果不能定位到該 元素次哈,則間隔一段時間后再去定位元素胎署; 如果在達到最大時長時還沒有找到指定元素,則拋出超 時異常 TimeoutException
- 在Selenium中把顯式等待的相關(guān)方法封裝在WebDriverWait類中
3.1 實現(xiàn)方式
1. 導包 等待類 --> from selenium.webdriver.support.wait import WebDriverWait
2. WebDriverWait(driver, timeout, poll_frequency=0.5)
1). driver:瀏覽器驅(qū)動對象
2). timeout:超時的時長窑滞,單位:秒
3). poll_frequency:檢測間隔時間琼牧,默認為0.5秒
3. 調(diào)用方法 until(method):直到...時
1). method:函數(shù)名稱,該函數(shù)用來實現(xiàn)對元素的定位
2). 一般使用匿名函數(shù)來實現(xiàn):lambda x: x.find_element_by_id("userA")
4. element = WebDriverWait(driver, 10, 1).until(lambda x: x.find_element_by_id("userA")
4. 顯式與隱式區(qū)別
- 作用域:隱式為全局元素哀卫,顯式等待為單個元素有效
- 使用方法:隱式等待直接通過驅(qū)動對象調(diào)用巨坊,而顯式等待方法封裝在WebDriverWait類中
- 達到最大超時時長后拋出的異常不同:隱式為NoSuchElementException,顯式等待為TimeoutException
下拉選擇框此改、彈出框趾撵、滾動條操作
1. 下拉選擇框操作
說明:下拉框就是HTML中<select>元素
1.1 如何操作下拉選擇框?
先定位到要操作的option元素共啃,然后執(zhí)行點擊操作
1.2 Select類
說明:Select類是Selenium為操作select標簽特殊封裝的占调。
實例化對象:
select = Select(element)
element: <select>標簽對應的元素,通過元素定位方式獲取移剪,
例如:driver.find_element_by_id("selectA")
操作方法:
1. select_by_index(index) --> 根據(jù)option索引來定位究珊,從0開始
2. select_by_value(value) --> 根據(jù)option屬性 value值來定位
3. select_by_visible_text(text) --> 根據(jù)option顯示文本來定位
Select類實現(xiàn)步驟分析
1. 導包 Select類 --> from selenium.webdriver.support.select import Select
2. 實例化Select類 select = Select(driver.find_element_by_id("selectA"))
3. 調(diào)用方法:select.select_by_index(index)
示例代碼
#導包
from selenium.webdriver.support.select import Select
select = Select(driver.find_element_by_id("selectA"))
select.select_by_index(2) # 根據(jù)索引實現(xiàn)
select.select_by_value("sh") # 根據(jù)value屬性實現(xiàn)
select.select_by_visible_text("A北京") # 根據(jù)文本內(nèi)容實現(xiàn)
2. 彈出框處理
網(wǎng)頁中常用的彈出框有三種
1. alert 警告框
2. confirm 確認框
3. prompt 提示框
2.2 彈出框處理方法
說明:Selenium中對處理彈出框的操作,有專用的處理方法纵苛;并且處理的方法都一樣
1. 獲取彈出框?qū)ο? alert = driver.switch_to.alert
2. 調(diào)用
alert.text --> 返回alert/confirm/prompt中的文字信息
alert.accept() --> 接受對話框選項
alert.dismiss() --> 取消對話框選項
2.3 示例代碼
# 定位alerta按鈕
driver.find_element_by_id("alerta").click()
# 獲取警告框
alert = driver.switch_to.alert
# 打印警告框文本
print(alert.text)
# 接受警告框
alert.accept()
# 取消警告框
# alert.dismiss()
3. 滾動條操作
滾動條:一種可控制頁面顯示范圍的組件
3.1 為什么要學習滾動條操作剿涮?
- 在HTML頁面中,由于前端技術(shù)框架的原因赶站,頁面元素為動態(tài)顯示幔虏,元素根據(jù)滾動條的下拉而被加載
- 頁面注冊同意條款,需要滾動條到最底層贝椿,才能點擊同意
3.2 實現(xiàn)方式
- 說明:selenium中并沒有直接提供操作滾動條的方法,但是它提供了可執(zhí)行JavaScript腳本 的方法陷谱,所以我們可以通過JavaScript腳本來達到操作滾動條的目的烙博。
1. 設(shè)置JavaScript腳本控制滾動條
js = "window.scrollTo(0,1000)"
(0:左邊距瑟蜈;1000:上邊距;單位像素)
2. selenium調(diào)用執(zhí)行JavaScript腳本的方法
driver.execute_script(js)
3.3 示例代碼
# 最底層
js1 = "window.scrollTo(0,10000)"
driver.execute_script(js1)
# 最頂層
js2 = "window.scrollTo(0,0)"
driver.execute_script(js2)
frame切換渣窜、多窗口切換
1. frame切換
# frame:HTML頁面中的一種框架铺根,主要作用是在當前頁面中指定區(qū)域顯示另一頁面元素;
# 形式一:[了解]
<frameset cols="25%,75%">
<frame src="frame_a.htm">
<frame src="frame_b.htm">
</frameset>
# 形式二:
<iframe name="iframe_a" src="demo_iframe.htm" width="200" height="200"></iframe>
1.1 frame切換方法
說明:在Selenium中封裝了如何切換frame框架的方法
方法:
1). driver.switch_to.frame(frame_reference) --> 切換到指定frame的方法
frame_reference:可以為frame框架的name乔宿、id或者定位到的frame元素
2). driver.switch_to.default_content() --> 恢復默認頁面方法
在frame中操作其他頁面位迂,必須先回到默認頁面,才能進一步操作
2. 多窗口切換
說明:在HTML頁面中详瑞,當點擊超鏈接或者按鈕時掂林,有的會在新的窗口打開頁面。
2.1 如何實現(xiàn)多窗口切換坝橡?
說明:在Selenium中封裝了獲取當前窗口句柄泻帮、獲取所有窗口句柄和切換到指定句柄窗口的方法;
句柄:英文handle计寇,窗口的唯一識別碼
方法:
1). driver.current_window_handle --> 獲取當前窗口句柄
2). driver.window_handles --> 獲取所有窗口句柄
3). driver.switch_to.window(handle) --> 切換指定句柄窗口
窗口截圖锣杂、驗證碼處理
思考:如果自動化測試腳本運行時出現(xiàn)了異常,該如何定位問題番宁?
1. 窗口截圖
說明:把當前操作的頁面元莫,截圖保存到指定位置
1.1 為什么要窗口截圖?
自動化腳本是由程序去執(zhí)行的蝶押,因此有時候打印的錯誤信息并不是十分明確柒竞。如果在執(zhí)行出錯的時候 對當前窗口截圖保存,那么通過圖片就可以非常直觀地看到出錯的原因播聪。
1.2 窗口截圖的方法
說明:在Selenium中朽基,提供了截圖方法,我們只需要調(diào)用即可
方法:
driver.get_screenshot_as_file(imgpath)
imgpath:圖片保存路徑
1.3 示例代碼
driver.find_element_by_id("userA").send_keys("admin")
driver.get_screenshot_as_file("./img/img01.jpg")
2. 驗證碼
說明:一種隨機生成的信息(數(shù)字离陶、字母稼虎、漢字、圖片招刨、算術(shù)題)等為了防止惡意的請求行為霎俩,增加應用的 安全性。
2.1 為什么要學習驗證碼沉眶?
在Web應用中打却,大部分系統(tǒng)在用戶登錄注冊的時候都要求輸入驗證碼,而我們在設(shè)計自動化測試腳本的時候谎倔, 就需要面臨處理驗證碼的問題柳击。
2.2 驗證碼的處理方式
說明:Selenium中并沒有對驗證碼處理的方法,在這里我們介紹一下針對驗證碼的幾種常用處理方式
方式:
1). 去掉驗證碼
(測試環(huán)境下-采用)
2). 設(shè)置萬能驗證碼
(生產(chǎn)環(huán)境和測試環(huán)境下-采用)
3). 驗證碼識別技術(shù)
(通過Python-tesseract來識別圖片類型驗證碼片习;識別率很難達到100%)
4). 記錄cookie
(通過記錄cookie進行跳過登錄)
提示:
1. 去掉驗證碼捌肴、設(shè)置萬能驗證碼:都是開發(fā)來完成蹬叭,我們在這里不用關(guān)注
2. 驗證碼識別技術(shù):成功率不高,驗證碼種類繁多状知,不太適合
3. 記錄cookie:比較實用
3. cookie
3.1 cookie是什么秽五?
- Cookie是由Web服務器生成的,并且保存在用戶瀏覽器上的小文本文件饥悴,它可以包含用戶相關(guān)的信息坦喘。
- Cookie數(shù)據(jù)格式:鍵值對組成(python中的字典)
- Cookie產(chǎn)生:客戶端請求服務器,如果服務器需要記錄該用戶狀態(tài)西设,就向客戶端瀏覽器頒發(fā)一個Cookie 數(shù)據(jù)
- Cookie使用:當瀏覽器再次請求該網(wǎng)站時瓣铣,瀏覽器把請求的數(shù)據(jù)和Cookie數(shù)據(jù)一同提交給服務器,服務器檢查該Cookie济榨,以此來辨認用戶狀態(tài)坯沪。
3.2 cookie的應用場景
- 實現(xiàn)會話跟蹤,記錄用戶登錄狀態(tài)
- 實現(xiàn)記住密碼和自動登錄的功能
- 用戶未登錄的狀態(tài)下擒滑,記錄購物車中的商品
4. Selenium操作cookie
說明:Selenium中對cookie操作提供相應的方法
方法:
1. get_cookie(name) --> 獲取指定cookie
name:為cookie的名稱
2. get_cookies() --> 獲取本網(wǎng)站所有本地cookies
3. add_cookie(cookie_dict) --> 添加cookie
cookie_dict:一個字典對象腐晾,必選的鍵包括:"name" and "value"
4.1 示例代碼
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
driver.add_cookie({'name':'BDUSS','value':'根據(jù)實際填寫'})
time.sleep(3)
driver.refresh()
time.sleep(3)
driver.quit()