很多人分辨不出什麼是alert、什麼是window,今天讨論下怎麼辨識alert和window,以及頁面元素如div僞裝的對話框。
一、分辨
1、alert:浏覽器彈出框,一般是用來确認某些操作、輸入簡單的text或使用者名、密碼等,根據浏覽器的不同,彈出框的樣式也不一樣,不過都是很簡單的一個小框。在fireBug中是無法擷取到該框的元素的,也就是說alert是不屬于網頁DOM樹的。如下圖所示:
2、window:浏覽器視窗,點選一個連結之後可能會打開一個新的浏覽器視窗,跟之前的視窗是平行關系(alert跟視窗是父子關系,或者叫從屬關系,alert必須依托于某一個視窗),有自己的位址欄、最大化、最小化按鈕等。這個很容易分辨
3、div僞裝對話框,是通過網頁元素僞裝成對話框,這種對話框一般比較花哨,内容比較多,而且跟浏覽器一看就不是一套,在網頁中用firebug能夠擷取到其的元素,如下圖:
二、alter操作
1、示例1:switch_to.alert , accept() , text
2、示例2:Alert(driver) , dismiss()
3、示例3:switch_to.alert , send_keys(keysToSend)
三、div類對話框
div類對話框是普通的網頁元素,通過正常的find_element就可以定位并進行操作。不在這裡進行詳述。注意設定一定的等待時間,以免還未加載出來便進行下一步操作,造成NoSuchElementException報錯。
針對二、三的所有描述的代碼展示和實作:
# -*- 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是不可能的