Selenium-API操作

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的得力助手澄成。

  • 作用:快速定位元素胧洒,查看元素信息


    image.png

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. 定位一組元素

image.png

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只酥?

  1. XPath即為XML Path的簡稱褥实,它是一門在 XML 文檔中查找元素信息的語言。
  2. 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定位策略(方式)

  1. 路徑-定位
  2. 利用元素屬性-定位
  3. 屬性與邏輯結(jié)合-定位
  4. 層級與屬性結(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定位?

  1. CSS(Cascading Style Sheets)是一種語言蜒秤,它用來描述HTML元素的顯示樣式汁咏;
  2. 在CSS中,選擇器是一種模式垦藏,用于選擇需要添加樣式的元素梆暖;
  3. 在Selenium中也可以使用這種選擇器來定位元素伞访。

提示:

  1. 在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方法進行的封裝掩驱;
image.png

元素操作、瀏覽器操作方法

元素常用操作方法

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è)置元素等待粟耻?

  1. 網(wǎng)絡速度慢
  2. 電腦配置低
  3. 服務器處理請求慢

1.3 元素等待類型

  1. 隱式等待
  2. 顯式等待

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ū)別

  1. 作用域:隱式為全局元素哀卫,顯式等待為單個元素有效
  2. 使用方法:隱式等待直接通過驅(qū)動對象調(diào)用巨坊,而顯式等待方法封裝在WebDriverWait類中
  3. 達到最大超時時長后拋出的異常不同:隱式為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 為什么要學習滾動條操作剿涮?

  1. 在HTML頁面中,由于前端技術(shù)框架的原因赶站,頁面元素為動態(tài)顯示幔虏,元素根據(jù)滾動條的下拉而被加載
  2. 頁面注冊同意條款,需要滾動條到最底層贝椿,才能點擊同意

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是什么秽五?

image.png
  1. Cookie是由Web服務器生成的,并且保存在用戶瀏覽器上的小文本文件饥悴,它可以包含用戶相關(guān)的信息坦喘。
  2. Cookie數(shù)據(jù)格式:鍵值對組成(python中的字典)
  3. Cookie產(chǎn)生:客戶端請求服務器,如果服務器需要記錄該用戶狀態(tài)西设,就向客戶端瀏覽器頒發(fā)一個Cookie 數(shù)據(jù)
  4. Cookie使用:當瀏覽器再次請求該網(wǎng)站時瓣铣,瀏覽器把請求的數(shù)據(jù)和Cookie數(shù)據(jù)一同提交給服務器,服務器檢查該Cookie济榨,以此來辨認用戶狀態(tài)坯沪。

3.2 cookie的應用場景

  1. 實現(xiàn)會話跟蹤,記錄用戶登錄狀態(tài)
  2. 實現(xiàn)記住密碼和自動登錄的功能
  3. 用戶未登錄的狀態(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()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丐一,隨后出現(xiàn)的幾起案子藻糖,更是在濱河造成了極大的恐慌,老刑警劉巖库车,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巨柒,死亡現(xiàn)場離奇詭異,居然都是意外死亡柠衍,警方通過查閱死者的電腦和手機洋满,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珍坊,“玉大人牺勾,你說我怎么就攤上這事≌舐” “怎么了驻民?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長履怯。 經(jīng)常有香客問我回还,道長,這世上最難降的妖魔是什么叹洲? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任柠硕,我火速辦了婚禮,結(jié)果婚禮上疹味,老公的妹妹穿的比我還像新娘仅叫。我一直安慰自己帜篇,他們只是感情好糙捺,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布诫咱。 她就那樣靜靜地躺著,像睡著了一般洪灯。 火紅的嫁衣襯著肌膚如雪坎缭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天签钩,我揣著相機與錄音掏呼,去河邊找鬼。 笑死铅檩,一個胖子當著我的面吹牛憎夷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昧旨,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼拾给,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了兔沃?” 一聲冷哼從身側(cè)響起蒋得,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乒疏,沒想到半個月后额衙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡怕吴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年窍侧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片转绷。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡伟件,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出暇咆,到底是詐尸還是另有隱情锋爪,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布爸业,位于F島的核電站其骄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扯旷。R本人自食惡果不足惜拯爽,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钧忽。 院中可真熱鬧逼肯,春花似錦、人聲如沸篮幢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葫辐。三九已至,卻和暖如春耿战,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剂陡。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鹏倘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓纤泵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捏题。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

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