Selenium和PhantomJS

Selenium是一個(gè)Web的自動(dòng)化測(cè)試工具,最初是為網(wǎng)站自動(dòng)化測(cè)試而開(kāi)發(fā)的加酵,類型像我們玩游戲用的按鍵精靈拳喻,可以按指定的命令自動(dòng)操作哭当,不同是Selenium 可以直接運(yùn)行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS這些無(wú)界面的瀏覽器)冗澈。
PhantomJS

是一個(gè)基于Webkit的“無(wú)界面”(headless)瀏覽器钦勘,它會(huì)把網(wǎng)站加載到內(nèi)存并執(zhí)行頁(yè)面上的 JavaScript,因?yàn)椴粫?huì)展示圖形界面亚亲,所以運(yùn)行起來(lái)比完整的瀏覽器要高效彻采。

1、如果我們把 Selenium 和 PhantomJS 結(jié)合在一起捌归,就可以運(yùn)行一個(gè)非常強(qiáng)大的網(wǎng)絡(luò)爬蟲(chóng)了肛响,這個(gè)爬蟲(chóng)可以處理 JavaScrip、Cookie惜索、headers特笋,以及任何我們真實(shí)用戶需要做的事情。

# 導(dǎo)入 webdriver
from selenium import webdriver

# 要想調(diào)用鍵盤(pán)按鍵操作需要引入keys包
from selenium.webdriver.common.keys import Keys

# 調(diào)用環(huán)境變量指定的PhantomJS瀏覽器創(chuàng)建瀏覽器對(duì)象
driver = webdriver.PhantomJS()

# 如果沒(méi)有在環(huán)境變量指定PhantomJS位置
# driver = webdriver.PhantomJS(executable_path="./phantomjs"))

# get方法會(huì)一直等到頁(yè)面被完全加載巾兆,然后才會(huì)繼續(xù)程序猎物,通常測(cè)試會(huì)在這里選擇 time.sleep(2)
driver.get("http://www.baidu.com/")

# 獲取頁(yè)面名為 wrapper的id標(biāo)簽的文本內(nèi)容
data = driver.find_element_by_id("wrapper").text

# 打印數(shù)據(jù)內(nèi)容
print data

# 打印頁(yè)面標(biāo)題 "百度一下,你就知道"
print driver.title

# 生成當(dāng)前頁(yè)面快照并保存
driver.save_screenshot("baidu.png")

# id="kw"是百度搜索輸入框角塑,輸入字符串"長(zhǎng)城"
driver.find_element_by_id("kw").send_keys(u"長(zhǎng)城")

# id="su"是百度搜索按鈕蔫磨,click() 是模擬點(diǎn)擊
driver.find_element_by_id("su").click()

# 獲取新的頁(yè)面快照
driver.save_screenshot("長(zhǎng)城.png")

# 打印網(wǎng)頁(yè)渲染后的源代碼
print driver.page_source

# 獲取當(dāng)前頁(yè)面Cookie
print driver.get_cookies()

# ctrl+a 全選輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')

# ctrl+x 剪切輸入框內(nèi)容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')

# 輸入框重新輸入內(nèi)容
driver.find_element_by_id("kw").send_keys("itcast")

# 模擬Enter回車鍵
driver.find_element_by_id("su").send_keys(Keys.RETURN)

# 清除輸入框內(nèi)容
driver.find_element_by_id("kw").clear()

# 生成新的頁(yè)面快照
driver.save_screenshot("itcast.png")

# 獲取當(dāng)前url
print driver.current_url

# 關(guān)閉當(dāng)前頁(yè)面,如果只有一個(gè)頁(yè)面吉拳,會(huì)關(guān)閉瀏覽器
# driver.close()

# 關(guān)閉瀏覽器
driver.quit()

2质帅、鼠標(biāo)動(dòng)作鏈


#導(dǎo)入 ActionChains 類
from selenium.webdriver import ActionChains

# 鼠標(biāo)移動(dòng)到 ac 位置
ac = driver.find_element_by_xpath('element')
ActionChains(driver).move_to_element(ac).perform()


# 在 ac 位置單擊
ac = driver.find_element_by_xpath("elementA")
ActionChains(driver).move_to_element(ac).click(ac).perform()

# 在 ac 位置雙擊
ac = driver.find_element_by_xpath("elementB")
ActionChains(driver).move_to_element(ac).double_click(ac).perform()

# 在 ac 位置右擊
ac = driver.find_element_by_xpath("elementC")
ActionChains(driver).move_to_element(ac).context_click(ac).perform()

# 在 ac 位置左鍵單擊hold住
ac = driver.find_element_by_xpath('elementF')
ActionChains(driver).move_to_element(ac).click_and_hold(ac).perform()

# 將 ac1 拖拽到 ac2 位置
ac1 = driver.find_element_by_xpath('elementD')
ac2 = driver.find_element_by_xpath('elementE')
ActionChains(driver).drag_and_drop(ac1, ac2).perform()

Selenium專門(mén)提供了Select類來(lái)處理下拉框。 其實(shí) WebDriver 中提供了一個(gè)叫 Select 的方法留攒,可以幫助我們完成這些事情:

# 導(dǎo)入 Select 類
from selenium.webdriver.support.ui import Select

# 找到 name 的選項(xiàng)卡
select = Select(driver.find_element_by_name('status'))

select.select_by_index(1)
select.select_by_value("0")
select.select_by_visible_text(u"未審核")
全部取消選擇怎么辦呢煤惩?很簡(jiǎn)單:
select.deselect_all()

3、頁(yè)面切換

一個(gè)瀏覽器肯定會(huì)有很多窗口炼邀,所以我們肯定要有方法來(lái)實(shí)現(xiàn)窗口的切換魄揉。切換窗口的方法如下:

driver.switch_to.window("this is window name")
使用 window_handles 方法來(lái)獲取每個(gè)窗口的操作對(duì)象。例如:

for handle in driver.window_handles:
    driver.switch_to_window(handle)

4拭宁、頁(yè)面等待

顯式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 庫(kù)洛退,負(fù)責(zé)循環(huán)等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 類,負(fù)責(zé)條件出發(fā)
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://www.xxxxx.com/loading")
try:
    # 頁(yè)面一直循環(huán)杰标,直到 id="myDynamicElement" 出現(xiàn)
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()
隱式等待

隱式等待比較簡(jiǎn)單兵怯,就是簡(jiǎn)單地設(shè)置一個(gè)等待時(shí)間,單位為秒腔剂。

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
driver.get("http://www.xxxxx.com/loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
當(dāng)然如果不設(shè)置媒区,默認(rèn)等待時(shí)間為0。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市袜漩,隨后出現(xiàn)的幾起案子绪爸,更是在濱河造成了極大的恐慌,老刑警劉巖宙攻,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奠货,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡座掘,警方通過(guò)查閱死者的電腦和手機(jī)递惋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溢陪,“玉大人丹墨,你說(shuō)我怎么就攤上這事℃依ⅲ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵喉前,是天一觀的道長(zhǎng)没酣。 經(jīng)常有香客問(wèn)我,道長(zhǎng)卵迂,這世上最難降的妖魔是什么裕便? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮见咒,結(jié)果婚禮上偿衰,老公的妹妹穿的比我還像新娘。我一直安慰自己改览,他們只是感情好下翎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著宝当,像睡著了一般视事。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庆揩,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天俐东,我揣著相機(jī)與錄音,去河邊找鬼订晌。 笑死虏辫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锈拨。 我是一名探鬼主播砌庄,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鹤耍?” 一聲冷哼從身側(cè)響起肉迫,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎稿黄,沒(méi)想到半個(gè)月后喊衫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杆怕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年族购,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陵珍。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寝杖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出互纯,到底是詐尸還是另有隱情瑟幕,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布留潦,位于F島的核電站只盹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏兔院。R本人自食惡果不足惜殖卑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坊萝。 院中可真熱鬧孵稽,春花似錦、人聲如沸十偶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惦积。三九已至睦袖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荣刑,已是汗流浹背馅笙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厉亏,地道東北人董习。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像爱只,于是被迫代替她去往敵國(guó)和親皿淋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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