selenium
【介紹】:selenium 是一套完整的web應(yīng)用程序測試系統(tǒng),包含了測試的錄制(selenium IDE)榆俺,編寫及運(yùn)行(Selenium Remote Control)和測試的并行處理(Selenium Grid)骑歹。
【通俗的解讀】:Selenium最初是為網(wǎng)站自動化測試而開發(fā)的预烙,Selenium 可以直接運(yùn)行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS)陵刹,當(dāng)然啦默伍,也可以接收指令,讓瀏覽器自動加載頁面衰琐,獲取需要的數(shù)據(jù)也糊,甚至頁面截屏,功能豐富羡宙,不容錯過哦 狸剃。
安裝:
pip install selenium
(最好是加一個清華源,安裝速度Plus):
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
Chrome瀏覽器驅(qū)動的安裝
可參考:http://blog.csdn.net/huilan_same/article/details/51896672
【注意】:要下載對應(yīng)版本的chromedriver:http://npm.taobao.org/mirrors/chromedriver/
Chromedriver 驅(qū)動
沒有驅(qū)動的狀態(tài)下,報錯:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.
(需要給'chromedriver'配置路徑)
【處理辦法】:在你編譯環(huán)境python中配置一下路徑狗热。分為以下兩個步驟:
- 找到你編譯環(huán)境python的文件路徑钞馁;
- 將你對應(yīng)版本的安裝文件(.exe)放入python目錄下的Scripts目錄中;
頁面元素定位符:
在爬蟲的一系列操作中匿刮,如何給目標(biāo)元素定位是十分總要的基礎(chǔ)操作僧凰。
selenium中 最核心的技巧是WebElement類型的識別和定位,主要介紹以下八類:
(1)By.id() 通過id定位
browser.find_element_by_id("kw")
【注解】:元素的id屬性來定位元素——id是唯一標(biāo)識
這里的兩種形式是同樣的效果..
browser.find_element_by_id("kw")
# 另一種形式:
browser.find_element((By.id,"kw"))
【重點(diǎn)】:這里的兩種形式是等價的熟丸!
(2)By.name() 通過name 定位
search=browser.find_element_by_name("wd")
search=browser.find_elements_by_name("wd")
【解釋】:
- 如果name屬性的值kw是唯一的训措,用
find_element_by_name
定位元素,返回值是一個值; - 如果name屬性的值kw不是唯一的绩鸣,用
find_elements_by_name
定位元素怀大,返回符合條件的多個值,保存在列表中呀闻,即返回的是列表化借。
(3)By.xpath() 通過xpath定位
browser.find_element_by_xpath("http://*[@id='kw']")
(4) By.className() 通過className定位
【介紹】:通過元素的class屬性來定位元素,class屬性不是絕對唯一的捡多。(標(biāo)簽的class屬性可能相同)
browser.find_element_by_class_name("s_ipt")
(5) By.cssSelector() 通過CSS 定位
browser.find_element_by_css_selector()
(6)By.linkText() 通過linkText
browser.find_element_by_link_text()
- 精確匹配——文本內(nèi)容唯一蓖康;
- 模糊匹配——通過文本內(nèi)容的部分內(nèi)容,文本內(nèi)容不唯一局服;
(7)By.tagName() 通過tagName
browser.find_element_by_tag_name("input")
(8)By.partialLinkText() 通過匹到的部分linkText
browser.find_element_by_partial_link_text()
【注意】:查找多個元素節(jié)點(diǎn)和元素單個節(jié)點(diǎn)相同钓瞭,只是將element + s。例如:
browser.find_elements_by_css_selector()
browser.find_elements_by_id()
browser.find_elements_by_name()
browser.find_elements_by_link_text()
browser.find_element_by_partial_link_text()
【小案例】:運(yùn)行小程序淫奔,在百度搜索簡書。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
try:
browser.get("https://www.baidu.com")
input = browser.find_element_by_id('kw')
input.send_keys('簡書')
input.send_keys(Keys.ENTER)
# 等待對象反應(yīng)
wait = WebDriverWait(browser,100)
locator = (By.ID,"content")
wait.until(EC.presence_of_element_located((locator)))
print(browser.current_url)
print(browser.get_cookies())
# print(browser.page_source)
ele = browser.find_element_by_id("content_left")
print(ele)
finally:
browser.close()
【小案例】:運(yùn)行小程序堤结,在京東搜索商品唆迁。
網(wǎng)址:https://www.jd.com
from time import sleep
from selenium import webdriver
# 京東商城搜索
def simulate_jd_search():
browser = webdriver.Chrome()
browser.get("https://www.jd.com")
# 模擬輸入問題
input = browser.find_element_by_id("key")
input.send_keys("手機(jī)")
time.sleep(3)
# 模擬清空內(nèi)容
input.clear()
input.send_keys("小豬")
button = browser.find_element_by_css_selector("button.button")
button.click()
time.sleep(10)
simulate_jd_search()
【小案例】:運(yùn)行小程序,模擬鼠標(biāo)拖拽
網(wǎng)址:https://www.runoob.com/try/try.php?filename=jqueryui-example-droppable
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
def simulate_drop():
browser = webdriver.Chrome()
browser.get("https://www.runoob.com/try/try.php?filename=jqueryui-example-droppable")
# 切換到id是iframeResult的iframe標(biāo)簽中竞穷;
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() #執(zhí)行
time.sleep(10) #延遲10秒
simulate_drop()
關(guān)于selenium.webdrive之ActionChains
ActionChains是自動執(zhí)行低級交互的一種方式唐责,例如:鼠標(biāo)移動,鼠標(biāo)點(diǎn)按瘾带,鍵盤操作鼠哥,文本操作等。
當(dāng)我們調(diào)用這里的方法時看政,這些操作會被先儲存在一個隊列中朴恳,當(dāng)我們調(diào)用perform()方法時,隊列中的操作會被按順序執(zhí)行允蚣,執(zhí)行后隊列被清空于颖。
關(guān)于ActionChains 類提供的鼠標(biāo)操作的常用方法見下表:
常用方法 | 鼠標(biāo)操作 | 參數(shù) |
---|---|---|
click(self, element=None) | 點(diǎn)擊 | 若參數(shù)None,那么點(diǎn)擊當(dāng)前位置嚷兔;若參數(shù)是element森渐,那么點(diǎn)擊此元素; |
click_and_hold(self, element=None) | 鼠標(biāo)左鍵按住某個元素 | 同上 |
context_click(self, element=None) | 右鍵點(diǎn)擊 | 同上 |
** double_click()** | 雙擊 | 同上 |
drag_and_drop(source, target) | 拖動 | 【source】: 元素位置冒晰;【target】: 目標(biāo)位置同衣; |
move_to_element(self, to_element): | 鼠標(biāo)懸停 | to_element: 定位需要懸停的元素 |
drag_and_drop_by_offset(self, source, xoffset, yoffset): | 按住元素,然后移動目標(biāo)偏移量 | 【source】: 元素位置壶运; 【xoffset】: X 軸的偏移量耐齐;【yoffset】: Y 軸的偏移量 |
key_down(self, value, element=None) | 應(yīng)用于修飾鍵(控制、alt和shift) | 【value】: 要發(fā)送的修飾符鍵;【element】:定位的元素 |
send_keys(self, *keys_to_send) | 發(fā)送到當(dāng)前焦點(diǎn)元素 | 要發(fā)送的按鍵蚪缀。(修飾符鍵常數(shù)可以在“Keys”類) |
【注】:更多鼠標(biāo)操作可參考:http://www.51testing.com/index.php?action-viewnews-itemid-3725836-php-1