Selenium 簡介
Selenium 是一個 Web 的自動化測試工具,最初是為網站自動化測試而開發的,類型像我們玩游戲用的按鍵精靈,可以按指定的命令自動操作,不同是 Selenium 可以直接運行在瀏覽器上,它支持所有主流的瀏覽器(包括 PhantomJS 這些無界面的瀏覽器)。
Selenium 可以根據我們的指令,讓瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網站上某些動作是否發生。
Selenium 自己不帶瀏覽器,不支持瀏覽器的功能,它需要與第三方瀏覽器結合在一起才能使用。
先下載 selenium webdriver geckodriver.exe
,下載好后放到 python 目錄里面。
Firefox 的目錄也要添加到環境變量中。
Selenium 庫里有個叫 WebDriver 的 API。WebDriver 有點兒像可以加載網站的瀏覽器,但是它也可以像 BeautifulSoup 或者其他 Selector 對象一樣用來查找頁面元素,與頁面上的元素進行交互(發送文本、點擊等),以及執行其他動作來運行網絡爬蟲。
Selenium 快速入門
# -*- coding:utf-8 -*- from selenium import webdriver # 要想調用鍵盤按鍵操作需要引入 keys 包 from selenium.webdriver.common.keys import Keys # 創建瀏覽器對象 driver = webdriver.Firefox() driver.get("http://www.baidu.com") # 打印頁面標題“百度一下你就知道” print(driver.title) # 生成當前頁面快照 driver.save_screenshot("baidu.png") # 是百度搜索框,輸入字符串“微博”,跳轉到搜索頁面 driver.find_element_by_id("kw").send_keys(u"微博") # 是百度搜索按鈕,click() 是模擬點擊 driver.find_element_by_id("su").click() # 獲取新的頁面快照 driver.save_screenshot(u"screenshot.png") # 打印網頁渲染后的源代碼 print(driver.page_source) # 獲取當前頁面 Cookie print(driver.get_cookies()) # ctrl+a 全選輸入框內容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a') # ctrl+x 剪切輸入框內容 driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x') # 輸入框重新輸入內容 driver.find_element_by_id("kw").send_keys("test") # 模擬 Enter 回車鍵 driver.find_element_by_id("su").send_keys(Keys.RETURN) # 清除輸入框內容 driver.find_element_by_id("kw").clear() # 生成新的頁面快照 driver.save_screenshot("test.png") # 獲取當前 url print(driver.current_url) # 關閉當前頁面,如果只有一個頁面,會關閉瀏覽器 driver.close() # 關閉瀏覽器 driver.quit()
1、頁面操作
假如有下面的輸入框:
<input type="text" name="user-name" id="passwd-id" />
查找方法如下:
# 獲取 id 標簽值 element = driver.find_element_by_id("passwd-id") # 獲取 name 標簽值 element = driver.find_element_by_name("user-name") # 獲取標簽名值 element = driver.find_elements_by_tag_name("input") # 也可以通過 XPath 來匹配 element = driver.find_element_by_xpath("//input[@]")
2、定位元素
# 通過 Id 定位目標元素 driver.find_element_by_id('i1') # 通過 className 定位目標元素,返回一個對象 driver.find_element_by_class_name('c1') # 通過 name 屬性定位目標元素,返回一個對象 driver.find_element_by_name('n1') # 通過 Xpath 定位目標元素,返回一個對象 driver.find_element_by_xpath('//*[@id="i1"]') # 通過 css Selector 定位目標元素,返回一個對象 driver.find_element_by_css_selector('#i1') # 通過標簽名稱定位,返回一個對象 driver.find_element_by_tag_name('input') # 通過標簽中的文本查找元素,返回一個對象 driver.find_element_by_link_text('登錄')
一次查找多個元素(這些方法會返回一個 list 列表):
# 通過 className 定位目標元素,返回一個集合 driver.find_elements_by_class_name('c1') # 通過 name 屬性定位目標元素,返回一個集合 driver.find_elements_by_name('n1') # 通過 Xpath 定位目標元素,返回一個集合 driver.find_elements_by_xpath('//*[@id="i1"]') # 通過 Css Selector 定位目標元素,返回一個集合 driver.find_elements_by_css_selector('#i1') # 通過標簽名稱定位,返回一個集合 driver.find_elements_by_tag_name('input') # 通過標簽中的文本查找元素,返回一個集合 driver.find_element_by_link_text('登錄') # 通過標簽中文本的模糊匹配查找,返回一個集合 find_elements_by_partial_link_text("訂單")
3、鼠標動作
# -*- coding:utf-8 -*- from selenium import webdriver # 要想調用鍵盤按鍵操作需要引入 keys 包 from selenium.webdriver.common.keys import Keys from selenium.webdriver import ActionChains # 創建瀏覽器對象 driver = webdriver.Firefox() # 打開頁面 driver.get("http://www.baidu.com") # 鼠標移動到某處 action1 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action1).perform() # 鼠標移動到某處單擊 action2 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action2).click(action2).perform() # 鼠標移動到某處雙擊 action3 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action3).double_click(action3).perform() # 鼠標移動到某處右擊 action4 = driver.find_element_by_id("su") ActionChains(driver).move_to_element(action4).context_click(action4).perform()
4、Select 表單
# 導入 Select 類 from selenium.webdriver.support.ui import Select # 找到 name 的選項卡 select = Select(driver.find_element_by_name('status')) select.select_by_index(1) select.select_by_value("0") select.select_by_visible_text(u"xxx")
以上是三種選擇下拉框的方式,它可以根據索引來選擇,可以根據值來選擇,可以根據文字來選擇。注意:
index 索引從 0 開始
value 是 option 標簽的一個屬性值,並不是顯示在下拉框中的值
visible_text 是在 option 標簽文本的值,是顯示在下拉框的值
全部取消方法
select.deselect_all()
5、彈窗處理
當頁面出現了彈窗提示:
alert = driver.switch_to_alert()
6、頁面切換
一個瀏覽器肯定會有很多窗口,所以我們肯定要有方法來實現窗口的切換。切換窗口的方法如下:
driver.switch_to.window("this is window name")
7、頁面前進和后退
driver.forward() #前進 driver.back() # 后退
8、模擬登陸豆瓣網站
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.Firefox() driver.get("http://www.douban.com") # 輸入賬號密碼 driver.find_element_by_name("form_email").send_keys("158xxxxxxxx") driver.find_element_by_name("form_password").send_keys("zhxxxxxxxx") # 模擬點擊登錄 driver.find_element_by_xpath("//input[@]").click() # 等待3秒 time.sleep(3) # 生成登陸后快照 driver.save_screenshot(u"douban.png") driver.quit()
以上就是 Selenium 的一些常用方法。