Web自動(dòng)化測(cè)試進(jìn)階二

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

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

直接報(bào)錯(cuò),原因是需要句柄

eleDaxing = driver.find_element_by_link_text("大興")
eleDaxing.click()

使用句柄

driver.get("http://bj.58.com")
print("點(diǎn)擊之前句柄:", driver.window_handles)
ele = driver.find_element_by_xpath(".//*[@id='fcNav']/em/a[1]")
ele.click()
list_windowns = driver.window_handles
print("點(diǎn)擊之后句柄:", driver.window_handles)
driver.switch_to.window(list_windowns[1])
eleDaxing = driver.find_element_by_link_text("大興")
eleDaxing.click()
10. 多表單切換
在網(wǎng)頁(yè)中,表單嵌套是很常見(jiàn)的情況,尤其是在登錄的場(chǎng)景
10.1 什么是多表單
實(shí)際上就是使用iframe/frame,引用了其他頁(yè)面的鏈接,真正的頁(yè)面數(shù)據(jù)并沒(méi)有出現(xiàn)在當(dāng)前源碼中,但是在瀏覽器中我們看到,簡(jiǎn)單理解可以使頁(yè)面中開(kāi)了一個(gè)窗口顯示另一個(gè)頁(yè)面
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)

打開(kāi)游覽器

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()

輸入賬號(hào)

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()
1. 彈出框操作

  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)和鍵盤(pán)操作
手動(dòng)測(cè)試時(shí)鍵盤(pán)的操作在selenium頁(yè)有實(shí)現(xiàn),關(guān)于鼠標(biāo)的操作由ActionChains()類(lèi)來(lái)提供,關(guān)于鍵盤(pán)的操作由Key()類(lèi)來(lái)提供
1)鼠標(biāo)操作

  • 導(dǎo)入動(dòng)作鏈類(lèi),動(dòng)作鏈可以儲(chǔ)存鼠標(biāo)的動(dòng)作,并一起執(zhí)行
    from selenium.webdriver import ActionChains
    ActionChains(driver)
  • 鼠標(biāo)右擊
    el = driver.find_element_by_xxx(value)
    context_click(el)
    對(duì)el執(zhí)行右擊
  • 執(zhí)行ActionChains中儲(chǔ)存的所有動(dòng)作
    perform()
  • 常用鼠標(biāo)動(dòng)作:
    ActionChains(driver).context_click(ele).perform() 點(diǎn)擊鼠標(biāo)右鍵
    ActionChains(driver). double_click(ele).perform() 點(diǎn)擊鼠標(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)鍵盤(pán)操作
鍵盤(pán)操作使用的是Keys類(lèi),一般配合send_keys使用

  • 導(dǎo)入
    from selenium.webdriver.common.keys import Keys
  • 常用鍵盤(pán)操作
    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) 回車(chē)鍵(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) 鍵盤(pán) F1
    send_keys(Keys.F12) 鍵盤(pán) F12
    14. 瀏覽器等待
    1) 為什么要進(jìn)行等待?
    1.網(wǎng)速慢
    2.網(wǎng)站內(nèi)容過(guò)多
    3.如果不進(jìn)行等待而直接定位元素,可能會(huì)拋出異常
    2) selenium中等待的分類(lèi):
  1. 顯示等待
    顯示等待是根據(jù)條件進(jìn)行等待,等待條件出現(xiàn)
    實(shí)現(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類(lèi)是由WebDirver 提供的等待方法。在設(shè)置時(shí)間內(nèi),默認(rèn)每隔一段時(shí)間檢測(cè)一次當(dāng)前頁(yè)面元素是否存在,如果超過(guò)設(shè)置時(shí)間檢測(cè)不到則拋出異常。
  • 案例
    WebDriverWait(driver,10,0.5).until(EC.presence_of_element_located(
    (By.CLASS_NAME,"g-hu")))
  • 思考:顯示等待與time的區(qū)別?
  1. 隱式等待
    隱式等待是根據(jù)是件進(jìn)行等待,等待特定時(shí)間
    driver.implicitly_wait(n)
    n的單位為秒,n為最大值,在這個(gè)最大值內(nèi)只要該界面上的全部元素都加載完成定就結(jié)束沒(méi)有加載出元素就拋出 NosuchException.
    注意:優(yōu)先隱式等待,次之顯式等待,最次固定等待
    15. 練習(xí)
  2. 使用游覽器登錄http://www.baidu.com
  3. 搜索淘寶官網(wǎng)
  4. 登錄用戶名和密碼
  5. 搜索商品(手機(jī),電腦,,,,),給定約束條件(價(jià)格,包郵,發(fā)貨地址。。。)
  6. 將商品添加到購(gòu)物車(chē)
  7. 在購(gòu)物中游覽該商品
  8. 根據(jù)自己的喜好進(jìn)行下面的操作
    16. 2.IDE功能簡(jiǎn)介
  9. 文件:創(chuàng)建、打開(kāi)和保存測(cè)試案例和測(cè)試案例集。編輯:復(fù)制、粘貼、刪除、撤銷(xiāo)和選擇測(cè)試案例中的所有命令。Options : 用于設(shè)置seleniunm IDE。
  10. 用來(lái)填寫(xiě)被測(cè)網(wǎng)站的地址。
  11. 速度控制:控制案例的運(yùn)行速度。
  12. 運(yùn)行所有:運(yùn)行一個(gè)測(cè)試案例集中的所有案例。
  13. 運(yùn)行:運(yùn)行當(dāng)前選定的測(cè)試案例。
  14. 暫停/恢復(fù):暫停和恢復(fù)測(cè)試案例執(zhí)行。
  15. 單步:可以運(yùn)行一個(gè)案例中的一行命令。
  16. 錄制:點(diǎn)擊之后,開(kāi)始記錄你對(duì)瀏覽器的操作。
  17. 案例集列表。
  18. 測(cè)試腳本;table標(biāo)簽:用表格形式展現(xiàn)命令及參數(shù)。source標(biāo)簽:用原始方式展現(xiàn),默認(rèn)是HTML語(yǔ)言格式,也可以用其他語(yǔ)言展示。
  19. 查看腳本運(yùn)行通過(guò)/失敗的個(gè)數(shù)。
  20. 當(dāng)選中前命令對(duì)應(yīng)參數(shù)。
  21. 日志/參考/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 + "/")
    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()

  1. 百度、QQ空間
  2. 導(dǎo)出
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容