《手把手教你》系列練習篇之8-python+ selenium自動化測試 -壓台篇(詳細教程)


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

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

 

您的肯定就是我進步的動力。如果你感覺還不錯,就請鼓勵一下吧!記得點波 推薦 不要忘記哦!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM