寫在前面
應公司要求讓我做個內部分享爹脾,所以我就寫了篇文章,順便也注冊一個簡書放上去了,這篇博客適合想學selenium的同學,這是一個入門教程,由于網上大量window系統(tǒng)的教程囚巴,mac的較少、所以我就用Mac安裝了一遍相關的工具友扰,做了個教程彤叉,此文較長。村怪。姆坚。
目錄:
Python3.x環(huán)境安裝(mac)
PyCharm編譯器破解版安裝
Selenium的環(huán)境搭建(mac)
安裝瀏覽器驅動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烹吵,有兩個方法:
方法一:從Python官網下載Python 3.7的安裝程序Python 3.7锈死,雙擊運行并安裝(傻瓜式操作一直下一步即可);
方法二:如果安裝了Homebrew,直接通過命令brew install python3安裝即可耘斩。
Python解釋器
當我們編寫Python代碼時,我們得到的是一個包含Python代碼的以.py為擴展名的文本文件侠讯。要運行代碼淫痰,就需要Python解釋器去執(zhí)行.py文件。
Mac電腦推薦:PyCharm
二循衰、安裝PyCharm破解版
第一步:官方下載PyCharm專業(yè)版(如果你已經下載有铲敛,建議你卸載刪除后(一定要把數(shù)據刪除干凈)重新下載,避免出現(xiàn)版本問題)
第二步:將DMG中的 PyCharm.app 拖動至 “應用程序”文件夾
第三步:下載JetbrainsCrack破解補丁包
第四步:將下載好的破解補丁包復制到 /Applications/PyCharm.app/Contents/bin/ 目錄中(找到應用程序/Pycharm 右鍵顯示包內容会钝,就可以看到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安裝路徑迁酸,然后保存先鱼。
第六步:啟動PyCharm,選擇激活碼激活,并在激活碼欄目輸入任意內容,然后點擊ok即可奸鬓。
大功告成:顯示到期日期為2100年
網上有不少用pip方式安裝selenium的焙畔,其實selenium本質就是第三方庫,我們可以采用pycharm自帶方式來安裝
三串远、使用PyCharm安裝selenium庫文件
第一步:在PyCharm啟動頁面進入設置Preferences
[圖片上傳失敗...(image-6c6ae1-1608864322297)]
第二步:進入Project Interpreter選項宏多,點擊“+”號
第三步:修改pip源,切換到國內https://pypi.tuna.tsinghua.edu.cn/simple/
[圖片上傳失敗...(image-9a5bba-1608864322297)]
第四步:安裝selenium
四抑淫、安裝瀏覽器驅動chromedriver(mac)
每個瀏覽器都有自己的驅動绷落,比如谷歌的chromedriver、火狐的geckodriver始苇、IE的IEDriverServer,
未安裝chrome驅動時砌烁,使用webdriver調chrome,并使用get方法傳url參數(shù)時會報錯催式;
TypeError: get() missing 1 required positional argument: 'url'
因此需要安裝相應的瀏覽器驅動函喉。
以下我們以谷歌的chromedriver為例:
1、查看chrome版本:輸入chrome://settings/help
-
注意:<mark> chromedriver的版本一定要與chrome 瀏覽器的版本一致,否則在運行的時候會報錯</mark>
查看chrome版本
2荣月、下載chromedriver
- 注意:<mark>需要翻墻才能下載</mark>
[圖片上傳失敗...(image-ba5275-1608864322297)]
3管呵、拷貝到:usr/local/bin 。并不是usr/bin,因為沒有系統(tǒng)管理員權限哺窄,拷貝到usr/bin下捐下,很難成功账锹,我嘗試直接粘貼,用命令拷貝等坷襟,都不行奸柬。最后發(fā)現(xiàn)拷貝到:usr/local/bin,就可以用了婴程。簡單可行廓奕。
注意:<mark>常見報錯原因:</mark>
- 瀏覽器和chromedriver版本不一致
- 防火墻導致無法訪問鉻瀏覽器,關閉防火墻
五档叔、python桌粉、selenimu、webdriver基本語法
1衙四、python基本語法:
推薦學習廖雪峰的python教程
2铃肯、selenium/webdriver常用知識點:
- 瀏覽器操作
1、瀏覽器最大化
driver.maximize_window()
2届搁、設置瀏覽器寬和高
driver.set_window_size(400,800)
3缘薛、控制瀏覽器前進、后退
driver.forward()
driver.back()
4卡睦、刷新頁面
driver.refresh()
5宴胧、輸入網址
driver.get("http://wenku.baidu.com")
6、獲得當前頁面title表锻,判斷頁面跳轉是否符合預期
driver.title
7恕齐、獲得當前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、清除內容旨巷,如默認用戶名和密碼
driver.find_element_by_css_selector('xxxxx').clear()
2巨缘、模擬鼠標點擊操作
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斧吐、獲取元素某個屬性值
driver.find_element_by_css_selector('xxxxx').get_attribute('type')
4又固、該元素用戶是否可見
driver.find_element_by_css_selector('xxxxx').is_displayde()
- 鼠標事件
ActionChains類操作鼠標事件ActionChains的使用:
首先引入:
from selenium.webdriver.common.actionchains import ActionChains
ActionChains的執(zhí)行原理調用ActionChains方法的時候,用戶行為不會立刻執(zhí)行,
而是將所有操作放在一個隊列中,當執(zhí)行perform()方法時,按照放入隊列的順序先進先出執(zhí)行ActionChains方法的書寫格式
perform():執(zhí)行
1仲器、鼠標右擊
driver.find_element_by_css_selector('xxxxx').context_click()
2、鼠標雙擊
driver.find_element_by_css_selector('xxxxx').double_click()
3仰冠、鼠標點擊
driver.find_element_by_css_selector('xxxxx').click()
4娄周、按住鼠標左鍵(不抬起)
driver.find_element_by_css_selector('xxxxx').click_and_hold()
5、鼠標移動到某個元素
ActionChains(driver).move_to_element(目標元素).perform()
6沪停、鼠標移動到某個坐標
ActionChains(driver).move_by_offset(xoffset,yoffset).perform()
7、將元素從起點source移動到終點target
ActionChains(driver). drag_and_drop(source, target).perform()
8裳涛、按照坐標移動
ActionChains(driver). drag_and_drop_by_offset(source, xoffset, yoffset).perform()
- 鍵盤事件
Keys類操作鍵盤事件
Keys類的使用
首先引入:
from selenium.webdriver.common.keys import Keys
1木张、輸入框輸入內容
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端三、復制
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、顯示等待(導入 WebDriverWait 包)
顯示等待欢摄,同樣也是 webdirver 提供的方法熬丧。在設置時間內,默認每隔一段時間檢測一次當前頁面元素是否存在怀挠,如果超過設置時間檢測不到則拋出異常析蝴。默認檢測頻率為0.5s,默認拋出異常為:NoSuchElementException
WebDriverWait(driver,10).until(EC.presence_of_element_located(locator))
driver.find_element_by_id("kw").send_keys('abc')
2绿淋、隱式等待
隱式等待闷畸,也叫智能等待,是 webdirver 提供的一個超時等待吞滞。隱的等待一個元素被發(fā)現(xiàn)佑菩,或一個命令完成。如果超出了設置時間的則拋出異常冯吓。
driver.implicitly(秒數(shù))
3倘待、強制等待(導入 time 包)
強制等待,設置固定休眠時間组贺。 python 的 time 包提供了休眠方法 sleep() 凸舵, 導入 time 包后就可以使用 sleep(),進行腳本的執(zhí)行過程進行休眠失尖。
time.sleep(秒數(shù))
- 定位frame中的對象
1啊奄、切換到iframe中
driver.switch_to.frame(id/name/xpath)
2渐苏、從未嵌套的iframe中返回(切到frame中之后,我們便不能繼續(xù)操作主文檔的元素菇夸,這時如果想操作主文檔內容琼富,則需切回主文檔。)
driver.switch_to.default_content()
3庄新、從嵌套的iframe中返回(parent_frame()這個相當于后退的方法鞠眉,我們可以隨意切換不同的frame)
driver.switch_to.parent_frame()
- 多窗口處理
- 要想在多個窗口之間切換,首先要獲得每一個窗口的唯一標識符號(句柄)择诈。通過獲得的句柄來區(qū)別分不同的窗口械蹋,從而對不同窗口上的元素進行操作
1、獲得當前窗口的句柄
driver.current_window_handle
2羞芍、獲得所有窗口的句柄
driver.window_handles
3哗戈、切換回指定句柄的窗口
driver.switch_to_handle("句柄")
4、關閉當前窗口
driver.close()
5荷科、關閉所有窗口
driver.quit()
- 下拉菜單處理
導入Select類:from selenium.webdriver.support.select import Select
使用方法:Select(driver.find_element_by_name("xxx")).select_by_index()
1唯咬、根據index屬性定位選項,index從0開始
Select(driver.find_element_by_css_selector('xxxxx').select_by_index(index))
2畏浆、根據value屬性定位
Select(driver.find_element_by_css_selector('xxxxx').select_by_value(value)
3胆胰、根據選項文本值來定位
Select(driver.find_element_by_css_selector('xxxxx').select_by_visible_text(text))
4、選擇第一個選項
Select(driver.find_element_by_css_selector('xxxxx').first_selected_option())
- 調用js代碼
1全度、調用js代碼
driver.execute_script()
舉個例子:
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編寫測試腳本
網易云音樂:
from selenium import webdriver
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 設置為最大窗口
# driver.maximize_window()
driver.set_window_size(1400, 880)
# 設置隱式等待
driver.implicitly_wait(10)
# 訪問網易云音樂
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()
# 輸入登錄手機號碼
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')
# 點擊播放
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()
# 點擊排行榜
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()
嗯~就這樣吧,如對文章有問題的小伙伴可以留言給我痒筒。下一篇出一個appium的教程宰闰。(未完待續(xù))