一文搞懂瀏覽器自動化測試框架selenium仆百!

1、selenium是什么奔脐?

Selenium 是一個用于Web應(yīng)用程序測試的工具俄周。Selenium測試直接運行在瀏覽器中吁讨,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11)峦朗,Mozilla Firefox建丧,Safari,Google Chrome甚垦,Opera等茶鹃。這個工具的主要功能包括:測試與瀏覽器的兼容性——測試你的應(yīng)用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上涣雕。測試系統(tǒng)功能——創(chuàng)建回歸測試檢驗軟件功能和用戶需求艰亮。支持自動錄制動作和自動生成 .Net、Java挣郭、Perl等不同語言的測試腳本迄埃。(轉(zhuǎn)自百度百科)

2、python中的selenium使用

代碼鏈接:https://github.com/princewen/python3_crawl

先來看一段完整的的代碼:

"""基本使用"""

fromseleniumimportwebdriver

fromselenium.webdriver.common.byimportBy

fromselenium.webdriver.common.keysimportKeys

fromselenium.webdriver.supportimportexpected_conditionsasEC

fromselenium.webdriver.support.waitimportWebDriverWait

browser=webdriver.Chrome()

try:

browser.get('https://www.baidu.com')

#找到百度的輸入框

input=browser.find_element_by_id('kw')

#在輸入框中輸入python

input.send_keys('Python')

#回車進行搜索

input.send_keys(Keys.ENTER)

#等待10s

wait=WebDriverWait(browser,10)

#直到contnet_left元素出現(xiàn)

wait.until(EC.presence_of_element_located((By.ID,'content_left')))

#打印當前url

print(browser.current_url)

#打印當前的cookie

print(browser.get_cookies())

#打印當前的源代碼

print(browser.page_source)

finally:

? ? browser.close()

在上面的代碼中兑障,我們先使用Chrome內(nèi)核構(gòu)造了一個瀏覽器侄非,獲取到了百度的鏈接,隨后找到了百度輸入框元素流译,在輸入框中輸入python并回車逞怨,相當于使用百度搜索python,使用顯式等待頁面內(nèi)容出現(xiàn)福澡,最后我們打印了url叠赦、cookie和頁面源代碼。

接下來我們將詳細介紹selenium的功能革砸。

2.1 訪問頁面

使用get方法請求一個頁面

browser=webdriver.Chrome()browser.get('https://www.taobao.com')print(browser.page_source)browser.close()

2.2 查找元素

查找元素分為查找一個元素或者查找多個元素除秀,可以使用通用的方法或者非通用方法,在通用方法中需要通過By的方式指定查找方式算利。查找方式可以通過id册踩、class、name效拭、xpath等形式暂吉。

#單個元素#除了下面的方式外,還有其它方式browser=webdriver.Chrome()browser.get('https://www.taobao.com')input_first=browser.find_element_by_id('q')input_second=browser.find_element_by_css_selector('#q')input_third=browser.find_element_by_xpath('//*[@id="q"]')print(input_first,input_second,input_third)browser.close()#通用方式browser=webdriver.Chrome()browser.get('https://www.taobao.com')input_first=browser.find_element(By.Id,'q')print(input_first)browser.close()#查找多個元素browser=webdriver.Chrome()browser.get('https://www.taobao.com')lis=browser.find_elements_by_css_selector(('.service-bd li'))lis_2=browser.find_elements(By.CSS_SELECTOR,'.service-bd li')#返回一個列表print(lis)print(lis_2)browser.close()

2.3 元素交互操作

元素的交互操作缎患,比如在文標框中輸入文字借笙、清除文本框中的文字,點擊按鈕等等较锡。

importtimebrowser=webdriver.Chrome()browser.get('https://www.taobao.com')input=browser.find_element_by_id('q')input.send_keys('iPhone')time.sleep(1)input.clear()input.send_keys('iPad')button=browser.find_element_by_class_name('btn-search')button.click()

2.4 交互動作

交互動作使用ActionChains业稼,這里的代碼展示了把元素從一個位置拖動到另一個位置的代碼。

fromselenium.webdriverimportActionChainsbrowser=webdriver.Chrome()url='http://www.runoob.com/try/try.php?filename=jqueryul-api=dropable'browser.get(url)#切換到iframebrowser.switch_to.frame('iframeResult')source=browser.find_element_by_css_selector('#draggable')target=browser.find_element_by_css_selector('#droppable')actions=ActionChains(browser)actions.drag_and_drop(source,target)actions.perform()

2.5 執(zhí)行javascript

browser=webdriver.Chrome()browser.get('https://www.zhihu.com/explore')browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')browser.execute_script('alert("To Bottom")')browser.close()

2.6 獲取元素屬性

可以通過get_attribute方法得到元素屬性蚂蕴,對于某些關(guān)鍵字低散,直接使用.就可以獲得俯邓。

"""獲取元素屬性"""browser=webdriver.Chrome()browser.get('https://www.zhihu.com/explore')logo=browser.find_element_by_id('zh-top-link-logo')print(logo)# 獲取classprint(logo.get_attribute('class'))input=browser.find_element_by_class_name('zu-top-add-question')#獲取文本print(input.text)#獲取其他信息print(input.id)print(input.location)print(input.tag_name)print(input.size)

2.7 切換frame

頁面之間frame的切換,需要注意的是在子frame中無法獲得父frame的元素熔号。

fromselenium.common.exceptionsimportNoSuchElementExceptionbrowser=webdriver.Chrome()url='http://www.runoob.com/try/try.php?filename=jqueryul-api=dropable'browser.get(url)#切換到iframebrowser.switch_to.frame('iframeResult')source=browser.find_element_by_css_selector('#draggable')try:logo=browser.find_element_by_class_name('logo')except NoSuchElementException:print('NO LOGO')browser.switch_to.parent_frame()logo=browser.find_element_by_class_name('logo')print(logo)print(logo.text)

2.8 等待

等待分為隱式等待和顯式等待稽鞭。在隱式等待中,只需要指定一個等待時間引镊,當我們獲取元素時朦蕴,如果超過等待時間還沒有獲取到元素,會拋出異常弟头。顯示等待構(gòu)造WebDriverWait對象吩抓,調(diào)用其until方法指定一個元素并制定相應(yīng)的等待形式,如元素的加載赴恨,元素可點擊等等疹娶,如果超過等待時間指定的元素沒有呈現(xiàn)或者不可點擊,那么就會拋出異常伦连。

browser=webdriver.Chrome()browser.get('https://www.zhihu.com/explore')"""隱式等待"""browser.implicitly_wait(10)"""如果這個元素沒有找到的話雨饺,會等待10s,如果還沒有找到惑淳,就會拋出異常"""logo=browser.find_element_by_id('zh-top-link-logo')print(logo)# 獲取classprint(logo.get_attribute('class'))browser.close()"""顯示等待"""

fromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.waitimportWebDriverWait

browser=webdriver.Chrome()browser.get('https://www.taobao.com/')wait=WebDriverWait(browser,10)#參數(shù)是元組额港,還有其他一些等待條件input=wait.until(EC.presence_of_element_located((By.ID,'q')))button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))browser.close()

2.9 前進后退

browser=webdriver.Chrome()browser.get('https://www.baidu.com')browser.get('https://www.taobao.com')browser.get('https://www.python.org')browser.back()time.sleep(1)browser.forward()browser.close()

2.10? cookies操作

browser=webdriver.Chrome()browser.get('https://www.zhihu.com/explore')print(browser.get_cookies())browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})print(browser.get_cookies())browser.delete_all_cookies()print(browser.get_cookies())

2.11 選項卡管理

browser=webdriver.Chrome()browser.get('https://www.baidu.com')browser.execute_script('window.open()')print(browser.window_handles)browser.switch_to_window(browser.window_handles[1])browser.get('https://www.zhihu.com/explore')browser.switch_to_window(browser.window_handles[0])browser.get('https://python.org')browser.close()

2.12 異常處理

fromselenium.common.exceptionsimportNoSuchElementException,TimeoutExceptionbrowser=webdriver.Chrome()try:browser.get('https://www.baidu.com')except TimeoutException:print('TIme out')try:browser.find_element_by_id('hello')except NoSuchElementException:print('NOT FOUND')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歧焦,隨后出現(xiàn)的幾起案子移斩,更是在濱河造成了極大的恐慌,老刑警劉巖倚舀,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹哭,死亡現(xiàn)場離奇詭異,居然都是意外死亡痕貌,警方通過查閱死者的電腦和手機风罩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舵稠,“玉大人超升,你說我怎么就攤上這事〔富玻” “怎么了室琢?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長落追。 經(jīng)常有香客問我盈滴,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任巢钓,我火速辦了婚禮病苗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘症汹。我一直安慰自己硫朦,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布背镇。 她就那樣靜靜地躺著咬展,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瞒斩。 梳的紋絲不亂的頭發(fā)上破婆,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音济瓢,去河邊找鬼荠割。 笑死妹卿,一個胖子當著我的面吹牛旺矾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播夺克,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼箕宙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铺纽?” 一聲冷哼從身側(cè)響起柬帕,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎狡门,沒想到半個月后陷寝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡其馏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年凤跑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叛复。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡仔引,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褐奥,到底是詐尸還是另有隱情咖耘,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布撬码,位于F島的核電站儿倒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呜笑。R本人自食惡果不足惜夫否,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一找筝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慷吊,春花似錦袖裕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堰酿,卻和暖如春疾宏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背触创。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工坎藐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哼绑。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓岩馍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親抖韩。 傳聞我的和親對象是個殘疾皇子蛀恩,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容