1.1概要
大家好收壕!我是lamecho(辣么丑),本篇文章將是我們介紹selenium使用的最后一篇進(jìn)階篇竖伯,會(huì)給大家?guī)硪恍└韶泿椭蠹夷軌蛱幚碓趯?shí)戰(zhàn)中碰到的實(shí)際問題蜡镶。
1.2
selenium繼續(xù)實(shí)戰(zhàn)百度頁面
我們繼續(xù)以百度作為實(shí)戰(zhàn)的對(duì)象。通過上一篇的講解械巡,我們大概知道了網(wǎng)頁元素的基本知識(shí)和對(duì)一些常見元素類型的操作刹淌,比如按鈕,input輸入框讥耗,鏈接等其實(shí)只要大家仔細(xì)分析它的tagname(標(biāo)簽)就能很快的找到并進(jìn)行輸入或點(diǎn)擊操作有勾。那么今天我將進(jìn)一步講解有關(guān)網(wǎng)頁或是瀏覽器的一些操作。比如接下來我們介紹的第一個(gè)新類型Select選擇條古程。
1.Select和option選項(xiàng)
在頁面如果碰到彈出的下拉選項(xiàng)該如何操作蔼卡,如下圖百度主頁的搜索設(shè)置中的紅框位置。
我們首先看看它的頁面源碼
# -*-encoding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.select import
Select
from selenium.webdriver.common.action_chains
import ActionChains
browser=webdriver.Firefox()
browser.maximize_window()
browser.get("https://www.baidu.com/")
browser.implicitly_wait(10)
el=browser.find_element_by_link_text(u'設(shè)置')
ActionChains(browser).move_to_element(el).release().perform()
browser.implicitly_wait(10)
browser.find_element_by_link_text(u'搜索設(shè)置').click()
browser.implicitly_wait(10)
sel=browser.find_element_by_id('nr')
Select(sel).select_by_value('50')
sleep(2)
Select(sel).select_by_index(1)
sleep(10)
browser.quit()
這里主要分析最后幾行腳本挣磨,在開始我們首先要導(dǎo)入Select模塊
from selenium.webdriver.support.select import
Select
sel=browser.find_element_by_id('nr')
#通過id將找到的select賦值給sel
Select(sel).select_by_value('50')
#用Select(sel)轉(zhuǎn)化sel為Select雇逞,然后就可以用Select的方法去做選擇荤懂。常用的方法有兩個(gè)select_by_value和select_by_index。這里要注意value值是標(biāo)簽里的value值不是text喝峦,index下標(biāo)從0開始計(jì)數(shù)势誊。
sleep(2)
Select(sel).select_by_index(1)
2.執(zhí)行腳本命令
有時(shí)候selenium提供給我們的方法不足以完成一些復(fù)雜的操作,這時(shí)候我們可以借助腳本命令去在頁面上完成相應(yīng)的動(dòng)作谣蠢。比如說怎么操作瀏覽器的滾動(dòng)條操作頁面上劃下劃呢粟耻?
我們先來看看腳本執(zhí)行的方法是怎么寫的
js='window.scrollTo(0,document.body.scrollHeight);'#下劃到頁面底部
browser.execute_script(js)
我們要執(zhí)行的js語句放到execute_script里就可以了,這里只是有關(guān)腳本的一個(gè)應(yīng)用展示眉踱,其實(shí)通過腳本命令我們還可以干很多事情挤忙。這里就要大家去多了解一些javascript相關(guān)的一些知識(shí)。比如
‘var
obj=document.getElementsByTagName_r(\"a\");return
obj[3].text=500;’
將找到的a標(biāo)簽的text值修改成500谈喳,那么最后網(wǎng)頁上對(duì)應(yīng)的這個(gè)元素的text值會(huì)變成500册烈。還有這樣js="return
document.readyState",將會(huì)返回當(dāng)前網(wǎng)頁的加載情況婿禽,依據(jù)腳本執(zhí)行的返回值赏僧,我們可以判斷頁面是否加載完成。
3.iframe標(biāo)簽
當(dāng)我們遇到這樣的標(biāo)簽時(shí)扭倾,該怎么辦呢淀零?它類似與頁面內(nèi)嵌了一個(gè)頁面,可以從上面的截圖查看到這是百度地圖的頁面源碼膛壹,在iframe框架中包含的是一個(gè)完整的html頁面驾中,這時(shí)我們要去在嵌套的框架頁面上定位操作元素,其實(shí)也非常簡單模聋,我們只要將browser切換到這個(gè)框架頁面中去就可以了肩民,使用語句browser.switch_to.frame(frame_ID)
frame_ID獲取可以在元素iframe中的源碼中獲取它的id(在selenium的API介紹中可以通過id和name獲取到iframe,但是實(shí)際當(dāng)中name屬性并不好用)。當(dāng)我們在frame中操作完成后链方,要繼續(xù)在原頁面執(zhí)行的話持痰,需要使用語句
browser.switch_to_default_content()
也就是再切換回原頁面內(nèi)容。這里再說一種情況祟蚀,如果我們遇到iframe框架的id是動(dòng)態(tài)的共啃,也就是每次頁面加載都會(huì)動(dòng)態(tài)指定id,我們可以在python中這樣處理:
frame_ID=browser.find_element_by_tag_name('iframe').get_attribute('id')
browser.switch_to.frame(frame_ID)
這樣寫就不需要考慮iframe框架的id問題暂题,因?yàn)槲覀円彩莿?dòng)態(tài)獲取當(dāng)前頁面的id值移剪。
4.讓頁面執(zhí)行鍵盤操作ActionChains
首先我們要導(dǎo)入一些新的包
from selenium.webdriver.common.action_chains importActionChains
from selenium.webdriver.common.keys import Keys
同樣的在百度搜索框中輸入,最后操作鍵盤的回車進(jìn)行檢索薪者。
browser.implicitly_wait(10)
el=browser.find_element_by_id('kw')
ActionChains(browser).send_keys_to_element(el,'lamecho').key_down(Keys.ENTER).key_up(Keys.ENTER).perform()
主要看最后一行send_keys_to_element(el,'lamecho')向el元素中輸入字符纵苛,緊接著key_down和key_up就是操作按下彈起Keys.ENTER(回車)。這樣寫是不是很方便,一行搞定幾個(gè)動(dòng)作攻人。另外它也可以實(shí)現(xiàn)組合鍵的操作取试,只要我們將按鍵的key_down,key_up順序?qū)憣?duì)就ok了怀吻。
5.瀏覽器的新標(biāo)簽
目前瀏覽器都會(huì)支持在一個(gè)窗口中打開多個(gè)頁面瞬浓,也就是我們常說的標(biāo)簽頁。那么當(dāng)我們在執(zhí)行操作時(shí)蓬坡,新的頁面是在新的標(biāo)簽頁中打開的猿棉,我們要怎么樣去在新的頁面中執(zhí)行元素的查找呢?曾經(jīng)在網(wǎng)絡(luò)上看到過有網(wǎng)友是通過鍵盤的物理按鍵Ctrl+tab去切換到新標(biāo)簽屑咳,誠然我們看到頁面是做了切換萨赁,但是這樣我們是無法繼續(xù)在這個(gè)新頁面去做元素查找的,因?yàn)槲覀兊腷rowser還是在原頁面兆龙,這個(gè)和frame切換一個(gè)道理杖爽。只有將我們的browser切換到新新頁面,才能繼續(xù)在新的頁面里去查找元素紫皇。我們看在python腳本中怎么去做這樣的操作慰安。
browser.implicitly_wait(10)
browser.find_element_by_id('TANGRAM__PSP_8__userName').send_keys('test')
browser.find_element_by_id('TANGRAM__PSP_8__password').send_keys('test')
#browser.find_element_by_id('TANGRAM__PSP_8__submit').click()
browser.find_element_by_link_text(u'立即注冊').click()
while 1:
h=browser.window_handles
iflen(h)==2:
name=h[1]
break
sleep(1)
browser.switch_to_window(name)
browser.implicitly_wait(10)
browser.find_element_by_id('TANGRAM__PSP_3__verifyCode').send_keys('1234')
繼續(xù)我們百度頁面的實(shí)戰(zhàn),當(dāng)我們打開登錄框后聪铺,我們最后一步是點(diǎn)擊的“登錄”按鍵化焕,我們將其注釋掉,改成點(diǎn)擊“立即注冊”按鍵计寇。實(shí)際執(zhí)行是百度頁面是在新的標(biāo)簽頁面中打開的注冊頁面,接著往下看我們的腳本脂倦,使用到了循環(huán)去執(zhí)行browser.window_handles番宁,去查找瀏覽器窗口的handle,當(dāng)新的標(biāo)簽打開后自然我們的窗口會(huì)變成兩個(gè)赖阻,它的長度自然也就會(huì)等于2蝶押,跳出循環(huán),然后我們再通過browser.switch_to_window(name)火欧,將我們的browser切換到新頁面中繼續(xù)我們的元素查找工作棋电。大家執(zhí)行一下效果是不是最后在校驗(yàn)碼的input中輸入了1234。
1.3進(jìn)階篇—結(jié)束
Selenium的進(jìn)階篇終于完稿了苇侵,其實(shí)也就是講述了實(shí)際項(xiàng)目中碰到的一點(diǎn)棘手問題赶盔,操作稍微復(fù)雜一些而已。而我在文章中所能涉及的內(nèi)容其實(shí)在selenium的使用上所能涵蓋的十之只有一二榆浓,大家要多多練習(xí)于未,共勉。
感謝大家耐心讀完,我是lamecho辣么丑烘浦。
原創(chuàng)文章抖坪,轉(zhuǎn)載請注明出處。新浪微博搜索“lamecho好棒” 歡迎大家來撩闷叉。
微博:https://weibo.com/u/6017986584