Python + selenium

原文鏈接:https://blog.csdn.net/u011541946/article/details/64129041

                       

1.  所需組建

1.1  Selenium for python

1.2  Python

1.3  Pychram

到 https://pypi.python.org/pypi/selenium#downloads 下載最新版本,當前是3.0.2

下載tar.gz的包

下載完解壓:

打開cmd,然後cd到解壓包當前路徑,輸入 python setup.py install

在cmd輸入python進入python環境,然後輸入 from selenium import webdriver,如果不報錯就代表selenium安裝成功。

第二個安裝selenium方式

還有一種安裝方式,在線安裝,在cmd輸入 python -m pip install selenium,然後回車,自動安裝。

pip show selenium 查看版本

    Python+Selenium基礎篇之2-打開和關閉谷歌瀏覽器

下載driver地址https://github.com/mozilla/geckodriver/releases,下載好這個exe文件後,把這個文件放到你的python安裝目錄下,放在瀏覽器安裝目錄下也可以,路徑要加到環境變量。例如:C:\Python27\geckdriver.exe。

from selenium import webdriver   # 導入webdriver包
 
driver = webdriver.Firefox()    # 初始化一個火狐瀏覽器實例:driver
 
driver.maximize_window()        # 最大化瀏覽器
 
driver.get("https://www.baidu.com")  # 通過get()方法,打開一個url站點
 
driver.quit()     #關閉並退出瀏覽器
   運行本文下面的代碼,有一個前提條件,IE,Chrome,Firefox都是默認安裝在C盤,安裝的時候不需要去更改安裝路徑。如果有不是默認安裝的,請卸載Firefox,重新下載文件,默認安裝到C盤。請相信我,不要浪費時間在,如何啓動非默認安裝位置下的Firefox瀏覽器。

1. 如何啓動Chrome

from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()  # 最大化瀏覽器
driver.implicitly_wait(8) # 設置隱式時間等待
 
driver.get("https://www.baidu.com")
driver.quit()
2. 如何啓動IE

from selenium import webdriver
 
 
driver = webdriver.Ie()
driver.maximize_window()
driver.implicitly_wait(8)
 
driver.get("https://www.baidu.com")
driver.quit()

注意:可能出現的報錯


Exception: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones. Enable Protected Mode must be set to the same value (enabled or disabled) for all zones.


解決辦法:Internet選項->安全; 把Internet站點,本地Intrant,受信任站點 三個地方的安全界面都設置相同等級,例如都設置中; 再次運行代碼就可以用IE打開百度了。

總結:目前,由於IE的不穩定性和速度問題,建議採用火狐或者谷歌瀏覽器來測試和debug自動化腳本。

開始寫自動化腳本之前,我們先學習幾個概念,在完全掌握了這幾個概念之後,有助於我們快速上手,如何去編寫自動化測試腳本。

      元素,在這個教程系列,我們說的元素之網頁元素(web element)。在網頁上面的文本輸入框,按鈕,多選,單選,標籤,和文字都叫元素,總之,凡是能在頁面顯示的對象都可以作爲頁面元素對象。

      元素定位,有時候也叫Locator,一個HTML頁面元素,可以用很多方法去描述這個元素的位置。打個比方,生活中地址,一個大廈,正常的地址是 xx省xx市xx區xx街道xxx號,這個具體描述就是這個大廈的Locator。同樣的道理,一個網頁元素,也有位置,也可以通過一些手段或者表達式去描述這個元素在頁面對應的位置。

      XPath,XPath即爲XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言。XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力,XPath 很快的被開發者採用來當作小型查詢語言。      Selenium一共有八種元素定位方法,其中,在實際開發自動化腳本過程中,XPath的使用是最多的一種方法,所以本文就介紹如何通過XPath來元素定位。學習了XPath元素定位後,其他7中方法,很容易理解,甚至已經學會了其中好幾種方法。
 ———————————————— 

一.XPath工具安裝

      爲了提高抓取元素XPath的,我推薦在Firefox上安裝一個firepath的插件,這個插件,可以幫我們快速獲取網頁元素的XPath表達式。

1.   打開火狐瀏覽器,如果沒有安裝,下載默認安裝

2.   點擊右上角,菜單-附件組件-擴展

3.   在搜索所有附件組件文本輸入框輸入:firebug

4.   找到Firebug,點擊 安裝。重複步驟3和4,搜索和安裝FirePath。

5.   安裝好了之後,會在火狐瀏覽器右上角顯示一個蟲子的圖標。

 

二.XPath工具簡單使用

我們用定位百度首頁的搜索輸入框這個元素定位來演示。

1.   打開百度首頁

2.   鼠標定位到搜索輸入框

3.   右鍵鼠標,選Inspect in FirePath

4.   打開界面如下圖
 ———————————————— 

①FirePath自動推薦該元素的XPath表達式

②該元素節點的詳細信息,XPath表達式選取重點區域

③找到一個匹配元素

       一般來說,自動推薦的XPath表達式定位不夠精確。我們大部分時候需要去步驟2中,找出能夠識別這個唯一元素的節點信息。剛好上面通過id=kw只能找到一個匹配的元素,說明這個XPath可用,看起來也簡潔。實際項目中,可能XPath表達式寫得很長,或者附近節點信息好多相同,不太好能夠快速找到一個唯一的節點信息去定位這個目標元素。接下來,我介紹幾種比較實用的XPath定位技巧,基本上能定位到所有的網頁元素。


 ———————————————— 

三.XPath定位技巧之text()方法

以百度首頁右上角“新聞”定位舉例

XPath如下圖


四.XPath定位技巧之contains()方法

      有時候,我們不喜歡寫很長的XPath表達式,而且節點信息裏面,有些信息是動態的,每次都獲取都不一樣,這個時候contains()方法就很好用。

JD首頁左側電腦菜單舉例


XPath寫法推薦,這裏用contains()方法來定位

這裏href = //diannao.jd.com, 如果我覺得這個href太長,我只取關鍵字diannao,利用contains()方法來定位就方便多了,推薦電腦這個元素的XPath://*/a[contains(@href,'diannao')]


五. 相對XPath路徑寫法


      有時候,我們遇到目標元素節點的信息很少,不足夠用來精確定位到目標元素,這個時候,我們就需要考慮,利用目標元素上下附件節點,通過確定附件的節點從而確定目標元素,這種方式就叫相對路徑。

這裏用百度新聞首頁的一個單選按鈕來舉例;


火狐瀏覽器上firepath給出的推薦表達式是:

這裏推薦的XPath是根據目標元素節點中id信息來定位的,這個通過id就能定位,當然好。有時候,如果這個id不能作爲參考值,我們需要利用相對定位方法來定位這個新聞標題前面的單選按鈕;

1)先根據for = newstitle 或者text()=新聞標題來定位“新聞標題”這個標籤。

2)根據相對定位來確定“新聞標題”前面的這個radio按鈕。

3)XPath的寫法是:.//*/label[@for='newstitle']/../input[@id='newstitle']

      由於,當前這個舉例不是很符合只能採用相對定位才能確定元素的場景,感覺這個表達式定位,在這裏反而更複雜化,但是,相對定位元素方法是一樣的,和上面舉例的步驟、思維方式是一致的。如果發生了,無法通過目標元素節點信息來定位,那麼,就要考慮是否採用相對路徑來解決這個問題。元素定位,理論上是沒有定位不到的元素,通過以上方法,基本上能定位項目中大部分元素。XPath元素定位就先介紹到這裏,以後如果有其他新的好的方法,會添加到這篇文章,接下來,我們開始寫一個真正意義上的第一個webui自動化腳本
 ———————————————— 

                                                             第一個完整的自動化測試腳本
# coding=utf-8
import time
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(8)
 
driver.get("https://www.baidu.com")
driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
driver.find_element_by_xpath("//*[@id='su']").click()
 
time.sleep(2)
# 第二個判斷方法
ele_string = driver.find_element_by_xpath("//div/h3/a[text()='官網']/../a").text
if (ele_string == u"Selenium - Web Browser Automation"):
    print "測試成功,結果和預期結果匹配!"
driver.quit()

這裏只利用 兩個等號(==)來判斷兩個字符串是否完全相同,有時候我們還需要對得到的字符串進行切割操作,才能進行去匹配,以後再介紹字符串切割處理在自動化測試結果判斷中的使用。

總結:自動化測試最難的在於如何去寫斷言,如何判斷測試結果是否通過。

                                        驗證控件是否被選中

判斷元素是否顯示在頁面(is_displayed()方法),本文我們來學習下,判斷一個控件是否被選中狀態。

還是以百度新聞舉例:

 

# coding=utf-8
import time
from selenium import webdriver
 
 
driver = webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(6)
driver.get("http://news.baidu.com/")
time.sleep(1)
try:
    driver.find_element_by_xpath("//*[@id='news']").is_selected()
    print ('Test Pass.')
except Exception as e:
    print ('Test fail',format(e))

總結:

元素方法is_selected()返回是是布爾值,用來判斷單選或者多選控件是否被選中,或者下拉選擇菜單是否選擇一個默認的option,都可以通過這個方法去判斷。

                  Python+Selenium練習篇之-獲取頁面元素大小

本文介紹如何通過Selenium方法去獲取頁面元素的大小。這個場景是可能在需要測試的,例如在前端測試過程中,需要去測試某一個控件是否和設計大小保持一致。

這裏用百度首頁的“百度一下”這個按鈕舉例,打印出這個按鈕的大小。

相關腳本代碼如下:

# coding=utf-8
import time
from selenium import webdriver
 
driver = webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(6)
driver.get("https://www.baidu.com/")
time.sleep(1)
search_btn = driver.find_element_by_id('su')
print (search_btn.size)

測試結果:

{'width': 100.0, 'height': 36.0}

                                   執行JavaScript

前面文章介紹了ActionChains下的鼠標懸停和右鍵操作,其實ActionChains還有其他方法,你可以 action = ActionChains,通過這,先初始化一個ActionChains實例對象,然後在action後面輸入一個點號,查看支持哪些action方法。本文開始介紹如何執行JS腳本,會用兩個例子說明。

示例一,執行js腳本觸發一個alert彈出框。相關腳本代碼如下:
 ———————————————— 
# coding=utf-8
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彈框。');") # 注意這裏的分號是英文輸入法的分號,不能用中文

 

示例二,執行js腳本來控制瀏覽器豎向滾動條

打開百度貼吧,然後拖動滾動條到左側 “地區"

# coding=utf-8
import time
from selenium import webdriver
 
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
driver.get("https://tieba.baidu.com/index.html")
time.sleep(1)
 
target_elem = driver.find_element_by_link_text("地區")
driver.execute_script("return arguments[0].scrollIntoView();",target_elem) # 用目標元素參考去拖動
#driver.execute_script("scroll(0,2400)") # 這個是第二種方法,比較粗劣,大概的拖動

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章