《手把手教你》系列練習篇之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()

好了,今天的練習就到這裡,希望大家好好的練習和理解。