天天看點

selenium之 辨識alert、window以及操作

很多人分辨不出什麼是alert、什麼是window,今天讨論下怎麼辨識alert和window,以及頁面元素如div僞裝的對話框。

一、分辨

1、alert:浏覽器彈出框,一般是用來确認某些操作、輸入簡單的text或使用者名、密碼等,根據浏覽器的不同,彈出框的樣式也不一樣,不過都是很簡單的一個小框。在fireBug中是無法擷取到該框的元素的,也就是說alert是不屬于網頁DOM樹的。如下圖所示:

selenium之 辨識alert、window以及操作
selenium之 辨識alert、window以及操作
selenium之 辨識alert、window以及操作

2、window:浏覽器視窗,點選一個連結之後可能會打開一個新的浏覽器視窗,跟之前的視窗是平行關系(alert跟視窗是父子關系,或者叫從屬關系,alert必須依托于某一個視窗),有自己的位址欄、最大化、最小化按鈕等。這個很容易分辨

3、div僞裝對話框,是通過網頁元素僞裝成對話框,這種對話框一般比較花哨,内容比較多,而且跟浏覽器一看就不是一套,在網頁中用firebug能夠擷取到其的元素,如下圖:

selenium之 辨識alert、window以及操作

二、alter操作

1、示例1:switch_to.alert , accept() , text

selenium之 辨識alert、window以及操作

2、示例2:Alert(driver) , dismiss()

selenium之 辨識alert、window以及操作

 3、示例3:switch_to.alert , send_keys(keysToSend)

selenium之 辨識alert、window以及操作

三、div類對話框

div類對話框是普通的網頁元素,通過正常的find_element就可以定位并進行操作。不在這裡進行詳述。注意設定一定的等待時間,以免還未加載出來便進行下一步操作,造成NoSuchElementException報錯。

selenium之 辨識alert、window以及操作

 針對二、三的所有描述的代碼展示和實作:

# -*- coding: utf-8 -*-

"""
@author: lucas
@Function:
@file: alertAndWindow.py
@time: 2021/8/22 9:02 上午
"""
import unittest

from selenium import webdriver
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.common.keys import Keys
from time import sleep


class CheckBandRadio(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome()

    # alert框的确認
    def test_alert_accept(self):
        driver = self.driver
        driver.maximize_window()
        driver.get('http://sahitest.com/demo/alertTest.htm')
        driver.find_element_by_name('b1').click()
        # 通過switch_to.alert切換到alert
        a = driver.switch_to.alert
        sleep(3)
        # text屬性輸出alert的文本
        # 輸出結果:Alert Message
        print a.text
        # alert“确認”
        a.accept()
        sleep(3)

    # alert框的取消
    def test_alert_dismiss(self):
        driver = self.driver
        driver.maximize_window()
        driver.get('http://sahitest.com/demo/confirmTest.htm')
        driver.find_element_by_name('b1').click()
        # 直接執行個體化Alert對象
        a = Alert(driver)
        sleep(3)
        # text屬性輸出alert的文本
        # 輸出結果:Some question?
        print a.text
        # alert“取消”
        a.dismiss()
        sleep(3)

    # alert框的輸入text
    def test_alert_send_keys(self):
        driver = self.driver
        driver.maximize_window()
        driver.get('http://sahitest.com/demo/promptTest.htm')
        driver.find_element_by_name('b1').click()
        # 通過switch_to.alert切換到alert
        a = driver.switch_to.alert
        sleep(3)
        # text屬性輸出alert的文本
        # 輸出結果:Some prompt?
        print a.text
        # 往prompt型alert中傳入字元串
        a.send_keys('send my words to alert!')
        sleep(3)
        a.accept()
        # 輸出結果:send my words to alert!
        print driver.find_element_by_name('t1').get_attribute('value')

    # window視窗操作
    def test_window(self):
        driver = self.driver
        driver.maximize_window()
        driver.get('http://sahitest.com/demo/index.htm')
        # 擷取目前視窗handle name
        current_window = driver.current_window_handle
        driver.find_element_by_link_text('Window Open Test With Title').click()
        # 擷取所有視窗handle name
        all_windows = driver.window_handles
        # 切換window,如果window不是目前window,則切換到該window
        for window in all_windows:
            if window != current_window:
                driver.switch_to.window(window)
        # 列印該頁面title
        # 輸出結果:With Title
        print driver.title
        driver.close()
        # 關閉新視窗後切回原視窗,在這裡不切回原視窗,是無法操作原視窗元素的,即使你關閉了新視窗
        driver.switch_to.window(current_window)
        # 列印原頁面title
        # 輸出結果:Sahi Tests
        print driver.title

    # div視窗操作
    def test_div(self):
        driver = self.driver
        driver.maximize_window()
        driver.get('https://www.baidu.com')
        sleep(3)
        # 這邊注意捕捉id,因為id是唯一的
        # 點選右上角的登入按鈕
        driver.find_element_by_id("s-top-loginbtn").click()
        sleep(3)
        # 百度登入彈窗彈出,點選使用者名登入
        driver.find_element_by_id("TANGRAM__PSP_11__footerULoginBtn").click()
        sleep(3)
        # 填寫使用者名
        driver.find_elements_by_id("TANGRAM__PSP_11__userName")[0].send_keys("輸入你的使用者名")
        # 填寫密碼
        driver.find_elements_by_id("TANGRAM__PSP_11__password")[0].send_keys("輸入你的密碼")
        sleep(5)
        # 點選登入
        driver.find_element_by_id("TANGRAM__PSP_11__submit").click()
        sleep(1)
        print driver.title

    def tearDown(self):
        self.driver.quit()


if __name__ == "__main__":
    unittest.main()      

 四、總結

1、Alert的所有操作

Alert(driver).accept()  # 等同于點選“确認”或“OK”

Alert(driver).dismiss()  # 等同于點選“取消”或“Cancel”

Alert(driver).authenticate(username,password)  # 驗證,針對需要身份驗證的alert,目前還沒有找到特别合适的示例頁面

Alert(driver).send_keys(keysToSend)  # 發送文本,對有送出需求的prompt框(上圖3)

Alert(driver).text  # 擷取alert文本内容,對有資訊顯示的alert框      

2、window操作:

2.1 window操作與alert基本平行,隻需要切換到新的window上便可以操作該window的元素:

driver.switch_to.window(window_handle)      

2.2 window是通過window句柄handle來定位的,查詢window句柄的兩個方法:

driver.current_window_handle

driver.window_handles      

2.3 隻能通過window的name來切換視窗,但window的name不是你想象的視窗title之類的,而是一串字元串,如‘{976ae257-19be-4b32-a82e-4ba5063ed0a2}’,是以你用title、url之類的想切window是不可能的