##python + selenium UI自動(dòng)化測試(適合小白入門)

寫在前面

應(yīng)公司要求讓我做個(gè)內(nèi)部分享,所以我就寫了篇文章,順便也注冊一個(gè)簡書放上去了,這篇博客適合想學(xué)selenium的同學(xué),這是一個(gè)入門教程,由于網(wǎng)上大量window系統(tǒng)的教程,mac的較少、所以我就用Mac安裝了一遍相關(guān)的工具,做了個(gè)教程,此文較長。。。

目錄:

  • Python3.x環(huán)境安裝(mac)

  • PyCharm編譯器破解版安裝

  • Selenium的環(huán)境搭建(mac)

  • 安裝瀏覽器驅(qū)動(dòng)chromedriver(mac)

  • python、selenium/webdriver常見基本語法

  • 使用python3.X編寫測試腳本

一、python3.x環(huán)境安裝

在Mac上安裝Python

如果你正在使用Mac,系統(tǒng)是OS X >= 10.9,那么系統(tǒng)自帶的Python版本是2.7。要安裝最新的Python 3.7,有兩個(gè)方法:

方法一:從Python官網(wǎng)下載Python 3.7的安裝程序Python 3.7,雙擊運(yùn)行并安裝(傻瓜式操作一直下一步即可);

方法二:如果安裝了Homebrew,直接通過命令brew install python3安裝即可。

Python解釋器

當(dāng)我們編寫Python代碼時(shí),我們得到的是一個(gè)包含Python代碼的以.py為擴(kuò)展名的文本文件。要運(yùn)行代碼,就需要Python解釋器去執(zhí)行.py文件。

Mac電腦推薦:PyCharm

二、安裝PyCharm破解版

第一步:官方下載PyCharm專業(yè)版(如果你已經(jīng)下載有,建議你卸載刪除后(一定要把數(shù)據(jù)刪除干凈)重新下載,避免出現(xiàn)版本問題)

第二步:將DMG中的 PyCharm.app 拖動(dòng)至 “應(yīng)用程序”文件夾

拖動(dòng)至 “應(yīng)用程序”文件夾

第三步:下載JetbrainsCrack破解補(bǔ)丁包

第四步:將下載好的破解補(bǔ)丁包復(fù)制到 /Applications/PyCharm.app/Contents/bin/ 目錄中(找到應(yīng)用程序/Pycharm 右鍵顯示包內(nèi)容,就可以看到Contents文件夾)如圖:

[圖片上傳失敗...(image-b99f25-1608864322297)]

第五步:用編輯器打開 /Applications/PyCharm.app/Contents/bin/pycharm.vmoptions 文件,添加 -javaagent:/Applications/PyCharm.app/Contents/bin/JetbrainsCrack-release-enc.jar在最后一行。如圖:

[圖片上傳失敗...(image-429573-1608864322297)]

注意:路徑修改成你的pycharm安裝路徑,然后保存。

第六步:啟動(dòng)PyCharm,選擇激活碼激活,并在激活碼欄目輸入任意內(nèi)容,然后點(diǎn)擊ok即可。

大功告成:顯示到期日期為2100年

PyCharm破解成功

網(wǎng)上有不少用pip方式安裝selenium的,其實(shí)selenium本質(zhì)就是第三方庫,我們可以采用pycharm自帶方式來安裝

三、使用PyCharm安裝selenium庫文件

第一步:在PyCharm啟動(dòng)頁面進(jìn)入設(shè)置Preferences

[圖片上傳失敗...(image-6c6ae1-1608864322297)]

第二步:進(jìn)入Project Interpreter選項(xiàng),點(diǎn)擊“+”號

添加

第三步:修改pip源,切換到國內(nèi)https://pypi.tuna.tsinghua.edu.cn/simple/

切換pip源到國內(nèi)

[圖片上傳失敗...(image-9a5bba-1608864322297)]

第四步:安裝selenium


安裝selenium

四、安裝瀏覽器驅(qū)動(dòng)chromedriver(mac)

每個(gè)瀏覽器都有自己的驅(qū)動(dòng),比如谷歌的chromedriver、火狐的geckodriver、IE的IEDriverServer,
未安裝chrome驅(qū)動(dòng)時(shí),使用webdriver調(diào)chrome,并使用get方法傳url參數(shù)時(shí)會報(bào)錯(cuò);

    TypeError: get() missing 1 required positional argument: 'url'

因此需要安裝相應(yīng)的瀏覽器驅(qū)動(dòng)。

以下我們以谷歌的chromedriver為例:

1、查看chrome版本:輸入chrome://settings/help

  • 注意:<mark> chromedriver的版本一定要與chrome 瀏覽器的版本一致,否則在運(yùn)行的時(shí)候會報(bào)錯(cuò)</mark>


    查看chrome版本

2、下載chromedriver

  • 注意:<mark>需要翻墻才能下載</mark>
    [圖片上傳失敗...(image-ba5275-1608864322297)]

3、拷貝到:usr/local/bin 。并不是usr/bin,因?yàn)闆]有系統(tǒng)管理員權(quán)限,拷貝到usr/bin下,很難成功,我嘗試直接粘貼,用命令拷貝等,都不行。最后發(fā)現(xiàn)拷貝到:usr/local/bin,就可以用了。簡單可行。


拷貝chromedriver到bin文件夾

注意:<mark>常見報(bào)錯(cuò)原因:</mark>

  • 瀏覽器和chromedriver版本不一致
  • 防火墻導(dǎo)致無法訪問鉻瀏覽器,關(guān)閉防火墻

五、python、selenimu、webdriver基本語法

1、python基本語法:

推薦學(xué)習(xí)廖雪峰的python教程

2、selenium/webdriver常用知識點(diǎn):

  • 瀏覽器操作
        
1、瀏覽器最大化

    driver.maximize_window()

2、設(shè)置瀏覽器寬和高

    driver.set_window_size(400,800)

3、控制瀏覽器前進(jìn)、后退

    driver.forward()

    driver.back()

4、刷新頁面

    driver.refresh()
    
5、輸入網(wǎng)址

    driver.get("http://wenku.baidu.com")
    
6、獲得當(dāng)前頁面title,判斷頁面跳轉(zhuǎn)是否符合預(yù)期
    
    driver.title
    
7、獲得當(dāng)前URL,一般用來測試重定向

    driver.current_url
            
  • Selenium 八種元素定位方法
        
1、id定位

    driver.find_element_by_id()

2、name定位

    driver.find_element_by_name()


3、class定位

    driver.find_element_by_class_name()
    
4、tag定位

    driver.find_element_by_tag_name()
    
5、link定位

    driver.find_element_by_link_text()

6、partial_link定位

    driver.find_element_by_partial_link_text()
    
7、xpath定位

    driver.find_element_by_xpath()
    
8、CSS定位

    driver.find_element_by_css_selector()

            
  • 操作測試對象
        
1、清除內(nèi)容,如默認(rèn)用戶名和密碼

    driver.find_element_by_css_selector('xxxxx').clear()

2、模擬鼠標(biāo)點(diǎn)擊操作

    driver.find_element_by_css_selector('xxxxx').click()

3、向輸入框輸入
    
    driver.find_element_by_css_selector('xxxxx').send_keys()

4、提交表單

    driver.find_element_by_css_selector('xxxxx').submit()
            
  • WebElement接口常用方法
        
1、返回元素尺寸
    
    driver.find_element_by_css_selector('xxxxx').size

2、獲取元素文本信息

    driver.find_element_by_css_selector('xxxxx').text

3、獲取元素某個(gè)屬性值

    driver.find_element_by_css_selector('xxxxx').get_attribute('type')

4、該元素用戶是否可見

    driver.find_element_by_css_selector('xxxxx').is_displayde()
            
  • 鼠標(biāo)事件
        
ActionChains類操作鼠標(biāo)事件ActionChains的使用:

首先引入:
from selenium.webdriver.common.actionchains import ActionChains

ActionChains的執(zhí)行原理調(diào)用ActionChains方法的時(shí)候,用戶行為不會立刻執(zhí)行,
而是將所有操作放在一個(gè)隊(duì)列中,當(dāng)執(zhí)行perform()方法時(shí),按照放入隊(duì)列的順序先進(jìn)先出執(zhí)行ActionChains方法的書寫格式

perform():執(zhí)行

1、鼠標(biāo)右擊
    
    driver.find_element_by_css_selector('xxxxx').context_click()

2、鼠標(biāo)雙擊

    driver.find_element_by_css_selector('xxxxx').double_click() 
    
3、鼠標(biāo)點(diǎn)擊
    
    driver.find_element_by_css_selector('xxxxx').click()
    
4、按住鼠標(biāo)左鍵(不抬起)
    
    driver.find_element_by_css_selector('xxxxx').click_and_hold()
    
5、鼠標(biāo)移動(dòng)到某個(gè)元素

    ActionChains(driver).move_to_element(目標(biāo)元素).perform()
    
6、鼠標(biāo)移動(dòng)到某個(gè)坐標(biāo)

    ActionChains(driver).move_by_offset(xoffset,yoffset).perform()
    
7、將元素從起點(diǎn)source移動(dòng)到終點(diǎn)target

    ActionChains(driver). drag_and_drop(source, target).perform()
    
8、按照坐標(biāo)移動(dòng)

    ActionChains(driver). drag_and_drop_by_offset(source, xoffset, yoffset).perform()
        
  • 鍵盤事件
Keys類操作鍵盤事件

Keys類的使用

首先引入:
from selenium.webdriver.common.keys import Keys

1、輸入框輸入內(nèi)容

    driver.find_element_by_class_name('j-phone').send_keys('18519533777')
        
2、全選

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.CONTROL,'a')

3、復(fù)制

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.CONTROL,'c')

4、粘貼

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.CONTROL,'v')

5、剪切

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.CONTROL,'x')

6、回車鍵

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.ENTER)

7、刪除鍵

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.BACK_SPACE)

8、空格鍵

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.SPACE)

9、制表鍵

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.TAB)

10、回退鍵

    driver.find_element_by_css_selector('xxxxx').send_keys(Keys.ESCAPE)
            
  • selenium中的三種等待方式
        
1、顯示等待(導(dǎo)入 WebDriverWait 包)

    顯示等待,同樣也是 webdirver 提供的方法。在設(shè)置時(shí)間內(nèi),默認(rèn)每隔一段時(shí)間檢測一次當(dāng)前頁面元素是否存在,如果超過設(shè)置時(shí)間檢測不到則拋出異常。默認(rèn)檢測頻率為0.5s,默認(rèn)拋出異常為:NoSuchElementException
    
    WebDriverWait(driver,10).until(EC.presence_of_element_located(locator))
    driver.find_element_by_id("kw").send_keys('abc')

2、隱式等待

    隱式等待,也叫智能等待,是 webdirver 提供的一個(gè)超時(shí)等待。隱的等待一個(gè)元素被發(fā)現(xiàn),或一個(gè)命令完成。如果超出了設(shè)置時(shí)間的則拋出異常。
    
    driver.implicitly(秒數(shù))

3、強(qiáng)制等待(導(dǎo)入 time 包)

    強(qiáng)制等待,設(shè)置固定休眠時(shí)間。 python 的 time 包提供了休眠方法 sleep() , 導(dǎo)入 time 包后就可以使用 sleep(),進(jìn)行腳本的執(zhí)行過程進(jìn)行休眠。
    
    time.sleep(秒數(shù))
            
  • 定位frame中的對象
        
1、切換到iframe中

    driver.switch_to.frame(id/name/xpath)

2、從未嵌套的iframe中返回(切到frame中之后,我們便不能繼續(xù)操作主文檔的元素,這時(shí)如果想操作主文檔內(nèi)容,則需切回主文檔。)

    driver.switch_to.default_content()

3、從嵌套的iframe中返回(parent_frame()這個(gè)相當(dāng)于后退的方法,我們可以隨意切換不同的frame)

    driver.switch_to.parent_frame()
            
  • 多窗口處理
    • 要想在多個(gè)窗口之間切換,首先要獲得每一個(gè)窗口的唯一標(biāo)識符號(句柄)。通過獲得的句柄來區(qū)別分不同的窗口,從而對不同窗口上的元素進(jìn)行操作
        
1、獲得當(dāng)前窗口的句柄

    driver.current_window_handle

2、獲得所有窗口的句柄

    driver.window_handles

3、切換回指定句柄的窗口

    driver.switch_to_handle("句柄")

4、關(guān)閉當(dāng)前窗口

    driver.close()

5、關(guān)閉所有窗口

    driver.quit()
            
  • 下拉菜單處理

導(dǎo)入Select類:from selenium.webdriver.support.select import Select

使用方法:Select(driver.find_element_by_name("xxx")).select_by_index()
        
1、根據(jù)index屬性定位選項(xiàng),index從0開始

    Select(driver.find_element_by_css_selector('xxxxx').select_by_index(index))

2、根據(jù)value屬性定位

    Select(driver.find_element_by_css_selector('xxxxx').select_by_value(value)

3、根據(jù)選項(xiàng)文本值來定位

    Select(driver.find_element_by_css_selector('xxxxx').select_by_visible_text(text))

4、選擇第一個(gè)選項(xiàng)

    Select(driver.find_element_by_css_selector('xxxxx').first_selected_option())
    
  • 調(diào)用js代碼

1、調(diào)用js代碼

    driver.execute_script()
    
舉個(gè)例子:

    js = 'var a = 100; var b = 200; var c = a + b; alert(c)'

    driver.execute_script(js)#會有彈框顯示300
            
  • 處理cookie
        
1、獲得所有cookie

    .driver.get_cookies()

2、獲得name屬性的cookie

    .driver.get_cookie(name)

3、添加cookie(cookie格式為字典,)

    .driver.add_cookie(cookie_dic)

4、刪除特定cookie

    .driver.delete_cookie(name)

5、刪除所有cookie

    .driver.delete_all_cookies()
            

六、使用python3.X編寫測試腳本

網(wǎng)易云音樂:

from selenium import webdriver
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
# 設(shè)置為最大窗口
# driver.maximize_window()
driver.set_window_size(1400, 880)
# 設(shè)置隱式等待
driver.implicitly_wait(10)
# 訪問網(wǎng)易云音樂
driver.get('https://music.163.com')
driver.find_element_by_class_name('m-tophead').click()
driver.find_element_by_class_name('u-btn2-2').click()

# 輸入登錄手機(jī)號碼
driver.find_element_by_class_name('j-phone').send_keys('185xxxxxxxx')

# 輸入登錄密碼
driver.find_element_by_class_name('j-pwd').send_keys('oooooooo')
driver.find_element_by_class_name('j-primary').click()

# 搜索"講真的"歌曲
driver.find_element_by_id('srch').send_keys('講真的')
driver.find_element_by_id('srch').send_keys(Keys.ENTER)
driver.switch_to.frame('contentFrame')

# 點(diǎn)擊播放
driver.find_element_by_css_selector('.srchsongst>div:nth-child(1) .ply').click()
time.sleep(5)
driver.switch_to.parent_frame()
# 暫停音樂播放
ActionChains(driver).move_to_element(driver.find_element_by_css_selector('.m-playbar')).perform()
driver.find_element_by_css_selector('.ply').click()

# 發(fā)現(xiàn)音樂
driver.find_element_by_css_selector('.m-nav .fst').click()

# 點(diǎn)擊排行榜
driver.find_element_by_css_selector('.wrap .nav li:nth-child(2)').click()

driver.switch_to.frame('contentFrame')

div=driver.find_element_by_id('song-list-pre-cache')
tbody=div.find_element_by_tag_name('tbody')
trlist=tbody.find_elements_by_tag_name('tr')
driver.implicitly_wait(0)

for tr in trlist:
    sftags = tr.find_elements_by_class_name('s-fc9')
    if sftags:
        # 歌曲名和演唱者名
        songName=tr.find_element_by_css_selector('td .txt b').get_attribute('title')
        authorName = tr.find_element_by_css_selector('td .text').get_attribute('title')

        print('{:10s}:{}'.format(songName, authorName))

driver.implicitly_wait(10)

input('....')
driver.quit()

嗯~就這樣吧,如對文章有問題的小伙伴可以留言給我。下一篇出一個(gè)appium的教程。(未完待續(xù))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容