《手把手教你》系列練習篇之8-python+ selenium自動化測試 -壓台篇(詳細教程)
- 2019 年 12 月 10 日
- 筆記
1. 簡介
本文是練習篇的最後一篇文章,雖然練習篇的文章到此就要和大家說拜拜了,但是我們的學習之路才剛剛開始。不要停下你的腳步,大步朝前走吧!比你優秀的人還在走著,我們有什麼理由停下自己的腳步了,生命不止,學習亦是如此。好了,宏哥的毒雞湯好
喝吧,喝夠了就開始學習吧。
本文主要是練習如何處理iframe切換、處理alert彈窗、獲取當前頁面全部資訊、獲取頁面href屬性和如何截圖保存等等內容,希望小夥伴或者童鞋們喜歡哈!!!
2. 處理iframe切換
本文介紹如何利用Selenium中方法,在不同iframe中切換。
問題:有時候我們發現元素定位沒問題,在測試回放的過程,發現就是找不到元素報錯。
2.1 示例一:
由於沒有找到合適的iframe網站,這裡不好用程式碼舉例,簡單文字加圖片來介紹。但是宏哥輾轉反側的睡不著,最後實在是沒招了。於是自己寫了一個簡陋比較low的網頁,利用iframe網頁框架,把網頁分成上下兩個不同iframe控制的頁面,把下面html程式碼保存到
一個記事本,然後修改名稱為index.html。
2.2 index.html
<html> <head><title>iframe test page</title></head> <body> <iframe id="frame1" src="https://www.baidu.com" name="slider" height="325" width="550"></iframe> <br> <iframe id="frame2" src="http://example.com" name="example" height="325" width="550"></iframe> </body> </html>
用本地瀏覽器打開如下圖:
用firepath來獲得百度文本輸入框的XPath截圖
看到了紅圈位置不是顯示Top Window,說明你要定位的目標元素在一個iframe里,如果要操作這個元素,首先需要從默認的Top Window,利用switch_to.frame('iframeid')方法來切換到具體的iframe,然後才能去操作目標元素。
正常百度頁面,文本輸入框截圖
方法介紹:
driver.switch_to.frame("iframe1") # 操作目標元素,這個目標元素在 iframe1裡面,這裡就是百度文本輸入框輸入文字 driver.switch_to.default_content() 如果有具體項目頁面利用了iframe, 自己動手寫一下腳本。
2.3 示例二:
宏哥最後終於找到了一個合適的demo來給小夥伴們或者童鞋們來用程式碼實際演練的例子如下:
步驟:
1.先確認你要操作的元素,是否存在與iframe中,如果元素在iframe中就需要切換
2.找到該iframe
3.切換到該iframe (兩種方式)
第一種方式:有三種方法,只是單純的切換 driver.switch_to.frame(1) #通過index(下標) driver.switch_to.frame('login_frame_qq') #通過name driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@name="login_frame_qq"]')) #通過webelement
第兩種方式:既等待元素可見又進行了iframe切換
WebDriverWait(driver,20).until(EC.frame_to_be_available_and_switch_to_it('login_frame_qq'))
4.切換完後,就以這個iframe中的html為主html
5.返回默認的html頁面,無論現在在那一層的iframe,執行一次即可。 driver.switch_to.default_content()
2.3.1 程式碼實現:
2.3.2 參考程式碼:
# coding=utf-8? # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行 # 2.注釋:包括記錄創建時間,創建人,項目名稱。 ''' Created on 2019-12-09 @author: 北京-宏哥 QQ交流群:705269076 Project: python+ selenium自動化測試練習篇8 ''' # 3.導入模組 import time from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.maximize_window() # 登錄騰訊課堂頁面 driver.get('https://ke.qq.com/course/list') # 點擊首頁登錄 WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[@id="js_login"]'))) driver.find_element_by_id("js_login").click() # 登錄彈窗點擊QQ登錄 WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[contains(@class,"btns-enter-qq")]'))) driver.find_element_by_xpath('//a[contains(@class,"btns-enter-qq")]').click() # iframe切換 # driver.switch_to.frame('login_frame_qq') #通過name driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@name="login_frame_qq"]')) #通過webelement # 彈窗點擊賬戶密碼登錄switcher_plogin #WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,'//a[@id="switcher_plogin"]'))) time.sleep(10) driver.find_element_by_xpath('//a[@id="switcher_plogin"]').click()
2.3.3 運行結果:
運行程式碼後,控制台列印如下圖的結果
2.3.4 瀏覽器運行結果:
瀏覽器的運行過程,宏哥這裡就不做螢幕錄製了,這個我們看一下結果。瀏覽器運行結果如下:
3. 處理Alert彈窗
本文來介紹如何通過Selenium方法去處理網頁Alert彈窗,和處理iframe類似,都是通過switch_to方法。這裡還是沒有找到合適的alert彈窗網站,我們就自己創建一個吧,前面文章介紹了如何通過執行JS來增加一個彈窗。
(1)使用switch_to方法先切換到瀏覽器彈出框 driver.switch_to.alert (2)Alert類提供了一系列的操作方法 dismiss(): 否 accept(): 是 text(): 獲取彈出框里的文本內容 send_keys(): 在彈出框里輸入文本
相關腳本程式碼如下:
3.1 程式碼實現:
3.2 參考程式碼:
# coding=utf-8? # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行 # 2.注釋:包括記錄創建時間,創建人,項目名稱。 ''' Created on 2019-12-09 @author: 北京-宏哥 QQ交流群:705269076 Project: python+ selenium自動化測試練習篇8 ''' # 3.導入模組 import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(6) driver.get("https://www.baidu.com") time.sleep(1) driver.execute_script("window.alert('這是一個測試Alert彈窗');") time.sleep(2) driver.switch_to_alert().accept() # 點擊彈出裡面的確定按鈕 #driver.switch_to_alert().dismiss() # 點擊彈出上面的X按
3.3 運行結果:
運行程式碼後,控制台列印如下圖的結果
注意: driver.switch_to_alert().accept()
這是一個老方法,在有些編輯器(後面會介紹一款Python的IDE工具)會提示這個方法劃橫線,說明在最新Selenium在Pyhton支援包里,這個方法被丟棄,雖然還是可以用,現在新的方法是switch_to.alert(),用這個最新方法,我測試了下,無法模擬點擊確定和點擊關
閉彈窗按鈕,所以這個地方選擇了舊的方法switch_to_alert()
4. 獲取當前頁面全部圖片資訊
本文來介紹下如何獲取當前頁面全部的圖片資訊,圖片資訊可能包括,圖片名稱,圖片大小等。
相關腳本程式碼如下:
4.1 程式碼實現:
4.2 參考程式碼:
# coding=utf-8? # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行 # 2.注釋:包括記錄創建時間,創建人,項目名稱。 ''' Created on 2019-12-09 @author: 北京-宏哥 QQ交流群:705269076 Project: python+ selenium自動化測試練習篇8 ''' # 3.導入模組 import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(6) driver.get("http://news.baidu.com") time.sleep(1) for image in driver.find_elements_by_tag_name("img"): print (image.text) print (image.size) print (image.tag_name)
4.3 運行結果:
運行程式碼後,控制台列印如下圖的結果
運行結果:
運行結果,發現沒有圖片名稱列印出來,說明百度新聞頁面,所有圖片都沒有給出text這個屬性,前端的妹子沒有寫圖片的text屬性。不相信的同學或者小夥伴們可以通過F12查看一下圖片是否有text這個屬性。
5. 獲取頁面元素的href屬性
本文來介紹如何通過Selenium獲取頁面元素的某一個屬性。一個元素可能有多個屬性,例如 class, id, name, text, href, vale等等。這裡我們舉例一個爬蟲中經常需要處理的鏈接問題:找出當前頁面所有的超鏈接。
已百度首頁為例,列印所有包含href的元素的鏈接。
相關腳本程式碼如下:
5.1 程式碼實現:
5.2 參考程式碼:
# coding=utf-8? # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行 # 2.注釋:包括記錄創建時間,創建人,項目名稱。 ''' Created on 2019-12-09 @author: 北京-宏哥 QQ交流群:705269076 Project: python+ selenium自動化測試練習篇8 ''' # 3.導入模組 import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(6) driver.get("https://www.baidu.com") time.sleep(1) for link in driver.find_elements_by_xpath("//*[@href]"): print (link.get_attribute('href')) driver.quit()
5.3 運行結果:
運行程式碼後,控制台列印如下圖的結果
這裡只是找元素的href屬性,如果你需要其它屬性,例如你需要查看頁面所有元素具有id值的話,你可以這樣寫: print (link.get_attribute('id'))
6. 如何截圖並保存
本文介紹如何利用Selenium的方法進行截圖,在測試過程中,是有必要截圖,特別是遇到錯誤的時候進行截圖。在selenium for python中主要有三個截圖方法,我們挑選其中最常用的一種。
get_screenshot_as_file()
相關程式碼如下:
6.1 程式碼實現:
6.2 參考程式碼:
# coding=utf-8? # 1.先設置編碼,utf-8可支援中英文,如上,一般放在第一行 # 2.注釋:包括記錄創建時間,創建人,項目名稱。 ''' Created on 2019-12-09 @author: 北京-宏哥 QQ交流群:705269076 Project: python+ selenium自動化測試練習篇8 ''' # 3.導入模組 import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(6) driver.get("https://www.baidu.com") time.sleep(1) driver.get_screenshot_as_file("C:\Users\你的賬戶名\Desktop\baidu.png") driver.quit()
6.3 運行結果:
運行程式碼後,控制台列印如下圖的結果
6.4 執行結果:
會在桌面保存一張百度首頁的截圖,圖片後綴是png。注意路徑是要兩個 \ 。如下圖:
7. 小結
7.1 多個iframe的切換問題
# 如:有兩個iframe:f1、f2 # 1.定位到f1 driver.switch_to_frame("f1") # 2.操作元素 # ······ # 3.退出iframe driver.switch_to_default_content() # 4.定位到f2 driver.switch_to_frame("f2") # ······
7.2 嵌套:f1中嵌套著f2
driver.switch_to_frame("f1") driver.switch_to_frame("f2") # 操作元素
7.3 退出iframe:
# 第一種方式:跳出所有iframe,回到主介面 driver.switch_to_default_content() # 第二種方式:回到f1(返回上一級) driver.switch_to.parent_frame()
好了,今天的練習就到這裡,希望大家好好的練習和理解。