selenium webdriver從安裝到使用(python語言),顯示等待和隱性等待用法,切換窗口或者frame,彈框處理,下拉菜單處理,模擬鼠標鍵盤操作等


selenium的用法

selenium2.0主要包含selenium IDE selenium webDriverIDE有點類似QTPLoadRunner的錄制功能,就是firefox瀏覽器的一個插件,用來錄制在瀏覽器的一系列操作,錄制完成后可以回放,可以轉換為代碼輸出出來。本節主要講的是seleniumwebdriver功能。結合Python語言來講解具體用法。

WebDriver 的實現原理:

WebDriver直接利用了瀏覽器的內部接口來操作瀏覽器。

對於不同平台中的不同瀏覽器,必須依賴瀏覽器內部的 Native Component (原生組件)來實現把對WebDriver API 調用轉化為對瀏覽器內部接口的調用。

Selenium 1.0采用JavaScript的合成事件來處理網頁元素的操作,例如要單擊某個頁面元素,要先使用JavaScript 定位到這個元素,然后觸發單擊事件。

 WebDriver 使用的是系統的內部接口或函數,首先是找到這個元素的坐標位置,並在這個坐標點觸發一個鼠標左鍵的單擊操作。

環境配置

在使用之前,首先要將用到的環境配置好,這里主要需要兩個環境,一個是selenium庫,是一個第三方庫,用pip install selenium安裝即可,或者可以去pypi官網下載安裝。(這里要注意版本要和webdriver對應,所以可以先不裝這個,先裝webdriver。)第二個環境就是瀏覽器的webdriver下載。

ChromeDriver的安裝

下載地址:http://chromedriver.storage.googleapis.com/index.html

如果下載后,使用的過程中出現問題,可以檢查一下是否因為driver的版本和瀏覽器不兼容,有一個對應關系:

 

Firefoxwebdriver下載安裝

我當時下載Firefox也是費了很大勁,剛開始所有都是用的最新版本,結果調用瀏覽器總是報錯,后來把版本降低才可以,並且這里driverFirefox也有對應關系,並且selenium3.6也只能支持Firefox47.0以上的版本.

從網上查的是:firefox 47+selenium 3.13.0+geckodriver 0.15.0

或者selenium3.5.0,firefox57,geckodriver-v0.19.1

 

我自己的筆記本配置也不是很好,所以我用的更低版本,目前看來這個版本還挺好用,selenium用的2.48.0Firefox用的35版本,網盤地址:

https://pan.baidu.com/s/10KKwT5y4QPYRaZ4alniOgA

 

如果想自己下載更新版本,也可以到下面這個網址去下

下載地址:https://github.com/mozilla/geckodriver/releases/

 

注意:如果想要使用低版本,但是selenium已經裝了最新的版本,可以使用pip uninstall selenium去卸載掉,卸載之后重新裝pip install selenium==2.48.0pip show selenium指令可以查看你自己安裝的版本。

 

再注意Firefox瀏覽器要關閉更新,找到選項--高級--更新,選擇不檢查更新,點擊確定,就可以了。一定要關閉自動更新。

IEwebdriver安裝

下載網址:https://www.nuget.org/packages/Selenium.WebDriver.IEDriver/

 

配置driver

下載好driver之后將下載下來的exe文件直接放到Python的安裝目錄即可。

 

 

2. selenium webdriver用法

2.1 driver的一般操作

使用webdriver之前要先導入模塊:

from selenium import webdriver

 

使用webdriver寫自動化測試腳本的步驟:

第一步:獲取瀏覽器的驅動,driver

第二步:打開待測試網址

第三步:找到你需要操作的元素,對這些元素進行單擊,雙擊,輸入文字等操作

第四步:關閉瀏覽器

 

對應的代碼:

driver = webdriver.Firefox()  #將火狐瀏覽器的驅動賦值給driver,這樣driver就可以有很多可以使用的方法了,比如下面這個打開一個網址的方法

driver = webdriver.Chrome() #獲取谷歌瀏覽器驅動

driver = webdriver.Ie() #獲取IE瀏覽器驅動

driver.get('http://www.baidu.com')

driver.quit()  #關閉driver

driver.close()  #關閉當前頁面

  

 

driver的其他常用方法或者屬性:

獲取當前頁面標題內容 driver.title

查看瀏覽器的名字 drvier.name

獲取當前網頁地址 driver.current_url

獲取當前頁面元素 driver.page_source

回退到之前打開的頁面 driver.back()

前進到回退之前的頁面 driver.forward()

頁面刷新 driver.refresh()

截取當前頁面並保存到1.png  driver.get_screenshot_as_file("..\\1.png")

設置瀏覽器窗口大小:

driver.set_window_size(800,600)

driver.maximize_window()

例如:

# encoding=utf-8

from selenium import webdriver

driver = webdriver.Chrome()

driver.get(r'http://www.baidu.com')

 

driver.maximize_window()

print(driver.title)

  

2.2 find_element_by_xxx方法查找頁面上的元素

元素定位有很多種方法,比如通過元素的id屬性,name屬性,link_text屬性,class屬性,xpath或者css

 

driver.find_element_by_id('su')  #尋找id為’su’的元素

driver.find_element_by_name('wd')  #尋找name為’wd’的元素

driver.find_element_by_link_text('貼吧')  #尋找鏈接文本信息為’貼吧’的元素

driver.find_element_by_class_name('c-tips-container')  #尋找classname為’c-tips-container’的元素

driver.find_element_by_tag_name('div')  #尋找標簽名帶有’div’的元素

driver.find_element_by_partial_link_text('新')  #尋找鏈接文本部分帶有’新’的元素

driver.find_element_by_xpath('//*[@id="kw"]')  #尋找id屬性為kw的元素

driver.find_element_by_css_selector('#kw')  #尋找id屬性為kw的元素

 

  

前面六種都比較簡單,第一種,根據id定位,什么時候使用呢?一般就是你要查找的這個元素有id屬性並且id屬性的值在網頁中是唯一的。nameclassname也同id一樣。使用方法就是調用driverdriver.find_element_by_id('su'),參數傳你要查找的元素的id屬性值。

link_text查找的是一個鏈接,根據鏈接的文本信息的內容進行查找。

tag_name按照標簽的名字進行查找,不常用。

partial_link_textlink_text,但是后面的內容可以不用寫全部的值。比如下面這個元素<a href="http://news.baidu.com" name="tj_trnews" class="mnav">新聞</a>

想找到這個元素,就可以這樣寫:driver.find_element_by_partial_link_text(''),前提是你的網頁沒有別的包含新的鏈接。如果有的話,默認是找到的第一個,如果沒找到,會拋NoSuchElementException的異常。

xpathcss在另外的博客隨筆里單獨介紹了,這里就不說明了,這么多種定位元素的方法,應該用哪種呢?基本常用的有通過idnameclass,然后就是xpath或者css了,xpathcss基本上所有的元素都可以定位到,所以一定要學習一下。通常用這兩個其中的一種就足夠了。推薦使用css,寫法更簡單,速度更快。但是如果后面要做移動自動化,還得學習一下xpath,因為安卓自動化里面用的是xpath

 

2.3 find_elements_by_xxx

driver還有一些和find_element_by_xxx類似的方法叫find_elements_by_xxx,這類方法返回的是一個列表,比如driver.find_elements_by_id('su') 這樣寫就獲取到了頁面上所有id屬性為su的元素。想要使用第幾個元素,用下標取即可。

2.4 對找到的元素進行操作

獲取元素坐標:

driver.find_element_by_id('su').location

在百度文本搜索框內輸入內容Python Selenium:

driver.find_element_by_name('wd').send_keys('Python Selenium')

清空文本搜索框的所有內容:

driver.find_element_by_name('wd').clear()

點擊搜索按鈕:

driver.find_element_by_id('su').click()

提交搜索按鈕:

driver.find_element_by_id('su').submit()

獲取搜索框的大小:

driver.find_element_by_id('kw').size

獲取控件id為’jgwab’所顯示的內容:

driver.find_element_by_id('jgwab').text

獲取控件id為’jgwab’的tag名稱:

driver.find_element_by_id('jgwab').tag_name

獲取控件id為’su’的type屬性:

driver.find_element_by_id('su').get_attribute('type')

判斷搜索文本框當前是否被顯示:

driver.find_element_by_name('wd').is_displayed()

判斷元素是否被選中:

driver.find_element_by_id('su').is_selected()   

 

 

例如百度一下python’,先打開百度首頁的網址,在輸入框輸入Python,點擊搜索:

# encoding=utf-8

from selenium import webdriver

driver = webdriver.Chrome()

driver.get(r'http://www.baidu.com')

driver.find_element_by_id("kw").click()

driver.find_element_by_id("kw").clear()

driver.find_element_by_id("kw").send_keys("Python")

driver.find_element_by_id("su").click()

  

 

2.5 模擬鼠標操作

需要導入模塊:from selenium.webdriver.common.action_chains import ActionChains

注意:當你調用ActionChains()的方法時,不會立即執行,而是會將所有的操作按順序存放在一個隊列里,當你調用perform()方法時,隊列中的內容會依次執行。

 

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver

#在搜索文本框利用context_click()進行鼠標右擊 ActionChains(driver).context_click(driver.find_element_by_id('kw')).perform() #在搜索文本框利用double_click()進行雙擊 ActionChains(driver).double_click(driver.find_element_by_id('kw')).perform() #利用drag_and_drop(source,target)從搜索文本框移動到‘百度一下’按鈕 ActionChains(driver).drag_and_drop(driver.find_element_by_id('kw'),driver.find_element_by_id('su')).perform() #利用move_to_element()停留在文本搜索框上 ActionChains(driver).move_to_element(driver.find_element_by_id('kw')).perform() #利用click_and_hold()可以點擊並且停留在搜索按鈕上 ActionChains(driver).click_and_hold(driver.find_element_by_id('su')).perform()

  

例如:

# encoding=utf-8

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains #導入模塊

driver = webdriver.Chrome()
driver.get(r'http://www.baidu.com')

label = driver.find_element_by_css_selector("#u1 > a.pf")  # 找到百度首頁上的設置鏈接
ActionChains(driver).move_to_element(label).perform()  # 模擬用戶懸浮
label_bel = driver.find_element_by_link_text("高級搜索")  #設置的下拉菜單里的高級搜索鏈接
label_bel.click()  # 模擬用戶點擊

  

2.6 模擬鍵盤操作

需要引入包Keys

from selenium.webdriver.common.keys import Keys

 

driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE) #Backspace

driver.find_element_by_id('kw').send_keys(Keys.SPACE) #Space

driver.find_element_by_id('kw').send_keys(Keys.DELETE) #Delete

driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a') # CTRL + A

driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x') # CTRL + X

driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'v') # CTRL + V

driver.find_element_by_id('kw').send_keys(Keys.ENTER)  #ENTER

driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'c')  # CTRL + C

driver.find_element_by_id('kw').send_keys(Keys.TAB)  # TAB

 

 

2.7 切換window或者Frame

對於現在的web應用程序來說,很少有單個window的情況,都是嵌入了其他的frameWebDrvier支持使用”switchTO”方法切換到其他window

切換window

獲取當前driver的所有窗口的方法:

driver.window_handles

切換到新窗口的方法:

driver.switch_to.window(窗口名或者窗口列表下標)

 

例如:

from selenium import webdriver

from time import sleep


# 打開chrome瀏覽器,並執行設置

driver = webdriver.Chrome()

driver.implicitly_wait(30)

driver.maximize_window()

# 打開百度首頁

driver.get("https://www.baidu.com")

# 輸入 騰訊課堂

driver.find_element_by_id('kw').send_keys('騰訊課堂')

# 點擊 百度一下

driver.find_element_by_id("su").click()

# 獲取所有窗口

windows = driver.window_handles

print('切換之前的窗口{}'.format(windows))

# 點擊騰訊課堂鏈接

driver.find_element_by_xpath('//*[@id="1"]/h3/a[1]').click()

sleep(4)

# 切換到新窗口

driver.switch_to.window(driver.window_handles[-1])

print('切換后的窗口{}'.format(driver.current_window_handle))

# 點擊登錄按鈕

sleep(5)

driver.find_element_by_id('js_login').click()

 

切換frame(或者iframe

方法:driver.switch_to.frame(‘’)

 

例如:

from selenium import webdriver

from time import sleep


driver = webdriver.Chrome()

driver.implicitly_wait(30)

driver.maximize_window()

# 打開百度首頁

driver.get("https://www.baidu.com")

# 輸入 騰訊課堂

driver.find_element_by_id('kw').send_keys('騰訊課堂')

# 點擊 百度一下

driver.find_element_by_id("su").click()

# 獲取所有窗口

windows = driver.window_handles

print('切換之前的窗口{}'.format(windows))

# 點擊騰訊課堂鏈接

driver.find_element_by_xpath('//a[contains(text(),"全部課程_在線 培訓 視頻 教程_")]').click()

sleep(4)

# 切換到新窗口

driver.switch_to.window(driver.window_handles[-1])

print('切換至后的窗口{}'.format(driver.current_window_handle))

# 點擊登錄按鈕

sleep(5)

driver.find_element_by_id('js_login').click()

sleep(5)

# 點擊QQ登錄

driver.find_element_by_xpath('//div[@class="content-btns"]/a[1]').click()

# 切換到qq登錄的frame

driver.switch_to.frame('login_frame_qq')

sleep(5)

# 點擊賬號密碼登錄

driver.find_element_by_id('switcher_plogin').click()

# 輸入賬號密碼,點確定

driver.find_element_by_id('u').send_keys('xx')

driver.find_element_by_id('p').send_keys('xx')

driver.find_element_by_id('login_button').click()

 

  

2.8 顯式等待和隱式等待

等待方法:

1.強制等待

time.sleep(3)

強制等待,不管你瀏覽器是否加載完,程序都得等待3,3秒一到,繼續執行下面的代碼,不建議經常使用這種強制等待方法

2.顯性等待WebDriverWait

from selenium.webdriver.support.ui import WebDriverWait

WebDriverWait(driver, 超時時長, 調用頻率x, 忽略異常).until(可執行方法, 超時時返回的信息)

WebDriverWait,配合該類的until()until_not()方法,就能夠根據判斷條件而進行靈活地等待了,它主要的意思就是:程序每隔x秒看一眼,如果條件成立了,則執行下一步,否則繼續等待,直到超過設置的最長時間,然后拋出TimeoutException

例如:

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.get('http://www.baidu.com')

driver.find_element_by_id('kw').send_keys('selenium')

driver.find_element_by_id('su').click()

# 顯性等待,等找到百度翻譯selenium這個鏈接

WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.XPATH,"//div[@id='5']/h3/a")))

#點擊百度翻譯

driver.find_element_by_xpath("//div[@id='5']/h3/a").click()

print(driver.current_url)

# driver.quit()

 

  

3.隱性等待implicitly_wait

driver.implicitly_wait(30)#在頁面上隱式等待30

隱性等待是設置一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間截止,然后執行下一步。注意這里有一個弊端,那就是程序會一直等待整個頁面加載完成,也就是一般情況下你看到瀏覽器標簽欄那個小圈不再轉,才會執行下一步,但有時候頁面想要的元素早就在加載完成了,但是因為個別js之類的東西特別慢,我仍得等到頁面全部完成才能執行下一步

2.9 彈框處理

操作瀏覽器的時候偶爾會遇到彈框,一般彈框分為三種:1、警告類彈框alert(),就是只顯示一個信息,一個確認按鈕那種,用於通知用戶;

2、確認類彈框confirm(),有確定和取消兩個按鈕。

3、消息類彈框,prompt(),需要輸入一些信息后再點擊確認按鈕或者取消按鈕。

這些彈框一般都是JavaScript生成的,定位彈框使用的方法是:

driver.switch_to.alert()

 

找到彈框后對彈框可以做相應的操作:

text 屬性,返回 alert/confirm/prompt 中的文字信息

accept() 點擊確認按鈕。

dismiss() 點擊取消按鈕,如果有的話。

send_keys() 輸入值,這個 alert\confirm 沒有對話框就不能用了,不然會報錯。

 

舉例如下:

接受彈窗

driver.switch_to_alert().accept()

 

得到彈窗的文本消息,比如得到:請輸入用戶名!

message=driver.switch_to_alert().text

print(message)

取消按鈕

driver.switch_to_alert().dismiss()

輸入值

driver.switch_to_alert().send_keys(hello)

 

例如:

from selenium import webdriver

from selenium.webdriver.common.action_chains import ActionChains

from time import sleep

driver = webdriver.Chrome()

driver.implicitly_wait(10)

driver.get("http://www.baidu.com")

# 鼠標懸停至"設置連接

link = driver.find_element_by_link_text('設置')

ActionChains(driver).move_to_element(link).perform()

# 打開搜索設置

driver.find_element_by_link_text('搜索設置').click()

sleep(2)

# 保存設置

driver.find_element_by_class_name('prefpanelgo').click()

sleep(2)

# 接受警告框

text = driver.switch_to_alert().text

print(text)

sleep(5)

# 點擊確認按鈕

driver.switch_to_alert().accept()

sleep(10)

driver.quit()

  

2.10 下拉菜單處理

假如有一個這樣的下拉菜單,默認選中第三個,我們想選中第一個,怎么選?

 

源代碼:

<html>

<body>

    <form>

        <select name="cars">

            <option value="volvo">Volvo</option>

            <option value="saab">Saab</option>

            <option value="fiat" selected="selected">Fiat</option>

            <option value="audi">Audi</option>

        </select>

    </form>

</body>

</html>

 

使用pythonwebdriver來操作的話,如下:

import time
from selenium import webdriver
from selenium.webdriver.support.select import Select  # 導入選中下拉菜單需要用的包

driver = webdriver.Chrome()

driver.get('file:///C:/Users/Administrator/Desktop/a.html')

time.sleep(2)


# 創建一個Select實例,參數傳的是select菜單的element對象

s = Select(driver.find_element_by_name('cars'))


# 第一種方式可以通過索引,索引從0開始,下面這句表示選擇第一個索引的內容Volvo

s.select_by_index(0)

time.sleep(2)

# 第二種方式通過value值,注意value是一個屬性

s.select_by_value('audi')

time.sleep(2)

# 第三種方式通過顯示出來的文本值

s.select_by_visible_text('Saab')

 

  

上面的例子是選擇一個選項,那么怎么取消選擇呢?

s.deselect_by_index(0)

s.deselect_by_value('audi')

s.deselect_by_visible_text('Saab')

s.deselect_all()   # 將所有選中的都取消選擇

 

all_selected_options屬性是表示哪些元素被選中了,下面可以遍歷一下所有被選中的元素:

options = Select(driver.find_element_by_name('cars')).all_selected_options

for option in options:

    print('已經被選中option文本值:' + option.text)

 

selenium IDE用法簡介

簡單說一下IDE的用法吧,IDE有時候也有點用處,比如你剛開始學習selenium,還不知道怎么下手,可以先用IDE錄制的方式去看看IDE是怎么形成自動化測試代碼的。

selenium IDE的安裝比較簡單,去Firefox的附加組件里面去搜索selenium IDE(注意中間有一個空格),安裝即可,我發的百度網盤鏈接里面也有一個IDE插件,可以直接裝到我發的那個火狐瀏覽器版本里面。

安裝好之后會有一個這個圖標:

 

這個就是selenium IDE插件了。使用它只需要三步,第一步,點擊它,打開如圖:

 

執行第二步:回放:

 

第三步:導出你想要的腳本

 

 

導出腳本以后打開,我導出的是Python2unittestwebdriver,可以主要參考下面這塊,

class TestBaiDu(unittest.TestCase):

    def setUp(self):

        self.driver = webdriver.Firefox()

        self.driver.implicitly_wait(30)

        self.base_url = "https://www.baidu.com/"

        # self.verificationErrors = []

        # self.accept_next_alert = True

    

    def test_TestBaiDu(self):

        driver = self.driver

        driver.get(self.base_url + "/")

        driver.find_element_by_id("kw").click()

        driver.find_element_by_id("kw").clear()

        driver.find_element_by_id("kw").send_keys("Python")

        driver.find_element_by_id("su").click()

 


免責聲明!

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



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