2.9.1.3Python-請(qǐng)求庫_selenium

總目錄:http://www.reibang.com/p/e406a9bc93a9

Python-爬蟲 - 子目錄:http://www.reibang.com/p/23cf57674bf1

官方手冊(cè):https://selenium-python.readthedocs.io/installation.html

什么是selenium

一種瀏覽器自動(dòng)化測(cè)試框架

用于web應(yīng)用程序的自動(dòng)化測(cè)試

特點(diǎn)

開源给梅、免費(fèi)

多平臺(tái)(windows肪虎、linux、mac)晌坤、瀏覽器(firefox、chrome仁锯、ie徐块、opera、safari)辉浦、多語言(java、phthon茎辐、ruby宪郊、php、c#拖陆、javascript)支持

對(duì)于web頁面有良好的支持

API簡(jiǎn)單弛槐、靈活(用開發(fā)語言驅(qū)動(dòng))易于使用

支持分布式測(cè)試用例執(zhí)行



之后我們來看一個(gè)普通例子:

這個(gè)例子用來在百度搜索Python,并返回頁面依啰。

from seleniumimport webdriver

from selenium.webdriver.common.byimport By

from selenium.webdriver.common.keysimport Keys

from selenium.webdriver.supportimport expected_conditionsas EC

from selenium.webdriver.support.waitimport WebDriverWait

browser = webdriver.Chrome()#定義使用谷歌瀏覽器

try:

????browser.get('https://www.baidu.com')????????????#訪問百度

? ? input = browser.find_element_by_id('kw')? ? ? #定位百度網(wǎng)頁輸入框

? ? input.send_keys('Python')? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #輸入Python

? ? input.send_keys(Keys.ENTER)? ? ? ? ? ? ? ? ? ? ? #點(diǎn)擊查詢

????wait = WebDriverWait(browser, 10)? ? ? ? ? ? ? ? ? #等待10秒

????wait.until(EC.presence_of_element_located((By.ID, 'content_left')))????#查找

? ? print(browser.current_url)? ? ? ? ? ? ? ? ? ? #當(dāng)前測(cè)試地址

????print(browser.get_cookies())? ? ? ? ? ? ? ? #當(dāng)前測(cè)試cookies

????print(browser.page_source)? ? ? ? ? ? ? ? #當(dāng)前測(cè)試頁面源代碼

finally:

????browser.close()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #關(guān)閉測(cè)試


運(yùn)行結(jié)果

我們可以看到乎串,這個(gè)庫的使用,大致分為三部分速警,第一部分是定義瀏覽器對(duì)象叹誉,第二部分發(fā)起請(qǐng)求,第三部分關(guān)閉瀏覽器對(duì)象闷旧。


定義瀏覽器對(duì)象

browser = webdriver.Chrome()? ? ? ? #谷歌

browser = webdriver.Firefox()? ? ? ? ? #火狐

browser = webdriver.Edge()? ? ? ? ? ? #IE

browser = webdriver.PhantomJS()? ? #PhantomJS

browser = webdriver.Safari()? ? ? ? ? ? #safari? ? ? ?


實(shí)例:

訪問淘寶網(wǎng)

browser = webdriver.Chrome()????????????????#聲明瀏覽器對(duì)象

browser.get('https://www.taobao.com')????#訪問淘寶首頁

print(browser.page_source)? ? ? ? ? ? ? ? ? ? ?#打印源碼

browser.close()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#關(guān)閉網(wǎng)頁


運(yùn)行結(jié)果


查找元素

既然我們能獲得源碼长豁,自然能夠從源碼中提取我們想要的信息


查找單個(gè)元素

from seleniumimport webdriver


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"]')

# 在這里我們使用了三種方式獲取輸入框,根據(jù)ID忙灼,CSS Selector匠襟,和XPath獲取,它們返回的結(jié)果是完全一致的。

print(input_first)

print(input_second)

print(input_third)

browser.close()

<selenium.webdriver.remote.webelement.WebElement (session="3be735d5a0dae6722e2e10ef54b25a64", element="0.8761863914068868-1")><selenium.webdriver.remote.webelement.WebElement (session="3be735d5a0dae6722e2e10ef54b25a64", element="0.8761863914068868-1")><selenium.webdriver.remote.webelement.WebElement (session="3be735d5a0dae6722e2e10ef54b25a64", element="0.8761863914068868-1")>


find_element()

Selenium還提供了通用的find_element()方法宅此,它需要傳入兩個(gè)參數(shù)机错,一個(gè)是查找的方式By爬范,另一個(gè)就是值父腕,實(shí)際上它就是find_element_by_id()這種方法的通用函數(shù)版本,比如find_element_by_id(id)就等價(jià)于find_element(By.ID, id)青瀑。

from seleniumimport webdriver

from selenium.webdriver.common.byimport By

browser = webdriver.Chrome()

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

input_first = browser.find_element(By.ID, 'q')

print(input_first)

browser.close()

<selenium.webdriver.remote.webelement.WebElement (session="c914e27eac6c1ee496cc4bb027f1f3fd", element="0.006866029616107161-1")>



查找多個(gè)元素

from seleniumimport webdriver

browser = webdriver.Chrome()

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

lis = browser.find_elements_by_css_selector('.service-bd li')

print(lis)

print(type(lis))

browser.close()


運(yùn)行結(jié)果

我們用find_element()再來試試

from seleniumimport webdriver

from selenium.webdriver.common.byimport By

browser = webdriver.Chrome()

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

lis = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')

print(lis)

print(type(lis))

browser.close()


運(yùn)行結(jié)果

運(yùn)行結(jié)果與上面一致璧亮。


元素交互

輸入文字用send_keys()方法,清空文字用clear()方法斥难,另外還有按鈕點(diǎn)擊枝嘶,用click()方法。

from seleniumimport webdriver

import time

browser = webdriver.Chrome()

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

input = browser.find_element_by_id('q')#定位輸入框

input.send_keys('iPhone')#輸入iPhone

time.sleep(1)

input.clear()#清空文字

input.send_keys('iPad')#輸入iPad

button = browser.find_element_by_class_name('btn-search')#定位標(biāo)簽

button.click()

browser.close()

運(yùn)行后可以看見下面三個(gè)階段的變換哑诊。


1


2
3


動(dòng)作鏈

from seleniumimport webdriver

from selenium.webdriverimport ActionChains

browser = webdriver.Chrome()

url ='http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'

browser.get(url)

browser.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()

browser.close()

首先我們打開網(wǎng)頁中的一個(gè)拖拽實(shí)例群扶,然后依次選中要被拖拽的元素和拖拽到的目標(biāo)元素,然后聲明了ActionChains對(duì)象賦值為actions變量镀裤,然后通過調(diào)用actions變量的drag_and_drop()方法竞阐,然后再調(diào)用perform()方法執(zhí)行動(dòng)作,就完成了拖拽操作暑劝。

運(yùn)行結(jié)果


執(zhí)行JavaScript

from seleniumimport webdriver

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()

在這里我們就利用了execute_script()方法將進(jìn)度條下拉到最底部骆莹,然后彈出alert提示框。

運(yùn)行結(jié)果




獲取元素信息


獲取屬性

from seleniumimport webdriver

from selenium.webdriverimport ActionChains

browser = webdriver.Chrome()

url ='https://www.taobao.com/'

browser.get(url)

logo = browser.find_element_by_id('q')

print(logo)

print(logo.get_attribute('aria-label'))

browser.close()

<selenium.webdriver.remote.webelement.WebElement (session="7f8d43c51f5ee0d350c1f83d6fa67309", element="0.7676622454832502-1")>?

請(qǐng)輸入搜索文字


獲取文本值

from seleniumimport webdriver

browser = webdriver.Chrome()

url ='https://www.zhihu.com/explore'

browser.get(url)

input = browser.find_element_by_class_name('ExploreSpecialCard-title')

print(input.text)

browser.close()

學(xué)生「自救」指南


獲取ID担猛、位置幕垦、標(biāo)簽名、大小

from seleniumimport webdriver

browser = webdriver.Chrome()

url ='https://www.zhihu.com/explore'

browser.get(url)

input = browser.find_element_by_class_name('ExploreSpecialCard-title')

print(input.id)

print(input.location)

print(input.tag_name)

print(input.size)

browser.close()

0.6825757990841457-1?

{'x': 542, 'y': 374}?

a?

{'height': 28, 'width': 330}???



高階用法

切換Frame

參考:http://www.reibang.com/p/9f7b0980c669

隱式等待

from seleniumimport webdriver

browser = webdriver.Chrome()

browser.implicitly_wait(10)

browser.get('https://www.zhihu.com/explore')

input = browser.find_element_by_class_name('ExploreSpecialCard-title')

print(input)

browser.close()

<selenium.webdriver.remote.webelement.WebElement (session="a0bd13999356b856226d80b20778d23e", element="0.23653782300671677-1")>



顯示等待

from seleniumimport webdriver

from selenium.webdriver.common.byimport By

from selenium.webdriver.supportimport expected_conditionsas EC

from selenium.webdriver.support.waitimport WebDriverWait

browser = webdriver.Chrome()

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

wait = WebDriverWait(browser, 10)

input = wait.until(EC.presence_of_element_located((By.ID, 'q')))

button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))

print(input, button)

browser.close()

<selenium.webdriver.remote.webelement.WebElement (session="2546d5873333781f46e584f3b94ac30d", element="0.4392430555610003-1")> <selenium.webdriver.remote.webelement.WebElement (session="2546d5873333781f46e584f3b94ac30d", element="0.4392430555610003-2")>


前進(jìn)后退

from seleniumimport webdriver

import time

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()


異常處理

from seleniumimport webdriver

from selenium.common.exceptionsimport TimeoutException, NoSuchElementException

browser = webdriver.Chrome()

try:

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

except TimeoutException:

????print('Time Out')

try:

????browser.find_element_by_id('hello')

except NoSuchElementException:

? ? print('No Element')

finally:

????browser.close()

No Element

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末傅联,一起剝皮案震驚了整個(gè)濱河市先改,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蒸走,老刑警劉巖仇奶,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異载碌,居然都是意外死亡猜嘱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門嫁艇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朗伶,“玉大人,你說我怎么就攤上這事步咪÷劢裕” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長点晴。 經(jīng)常有香客問我感凤,道長,這世上最難降的妖魔是什么粒督? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任陪竿,我火速辦了婚禮,結(jié)果婚禮上屠橄,老公的妹妹穿的比我還像新娘族跛。我一直安慰自己,他們只是感情好锐墙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布礁哄。 她就那樣靜靜地躺著,像睡著了一般溪北。 火紅的嫁衣襯著肌膚如雪桐绒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天之拨,我揣著相機(jī)與錄音茉继,去河邊找鬼。 笑死敦锌,一個(gè)胖子當(dāng)著我的面吹牛馒疹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乙墙,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼颖变,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了听想?” 一聲冷哼從身側(cè)響起腥刹,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汉买,沒想到半個(gè)月后衔峰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛙粘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年垫卤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片出牧。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡穴肘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舔痕,到底是詐尸還是另有隱情评抚,我是刑警寧澤豹缀,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站慨代,受9級(jí)特大地震影響邢笙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侍匙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一氮惯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丈积,春花似錦筐骇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厌均。三九已至唬滑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棺弊,已是汗流浹背晶密。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留模她,地道東北人稻艰。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像侈净,于是被迫代替她去往敵國和親尊勿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • selenium用法詳解 selenium主要是用來做自動(dòng)化測(cè)試畜侦,支持多種瀏覽器元扔,爬蟲中主要用來解決JavaScr...
    陳_CHEN_陳閱讀 3,900評(píng)論 1 5
  • 基本使用 from selenium import webdriverfrom selenium.webdrive...
    TianNanLeo閱讀 310評(píng)論 0 1
  • selenium主要是用來做自動(dòng)化測(cè)試,支持多種瀏覽器旋膳,爬蟲中主要用來解決JavaScript渲染問題澎语。 模擬瀏覽...
    拾柒丶_8257閱讀 2,194評(píng)論 0 2
  • # Selenium # # 自動(dòng)化測(cè)試工具,致辭多種瀏覽器 # 爬蟲中主要用來解決JavaScript渲染的問題...
    拾柒丶_8257閱讀 390評(píng)論 0 0
  • Selenium 視頻地址: 鏈接:https://pan.baidu.com/s/1RJETygOxiT1t2c...
    小草_f57c閱讀 458評(píng)論 0 0