1. Selenium簡介
??Selenium 是一個用于 Web 應用程序測試的工具。最初是為網站自動化測試而開發的,可以直接運行在瀏覽器上,支持的瀏覽器包括 IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera 和 Edge 等。
??爬蟲中使用它是為了解決 requests 無法直接執行 JavaScript 代碼的問題。Selenium 本質上是通過驅動瀏覽器,徹底模擬瀏覽器的操作,好比跳轉、輸入、點擊、下拉等,來拿到網頁渲染之后的結果。Selenium 是 Python 的一個第三方庫,對外提供的接口能夠操作瀏覽器,從而讓瀏覽器完成自動化的操作。
2. 為什么使用Selenium?
??
????????Selenium 能模擬瀏覽器功能自動執行網頁中的 JavaScript 代碼,實現動態加載。
3. Selenium的安裝
??谷歌瀏覽器驅動下載地址:https://registry.npmmirror.com/binary.html?path=chromedriver/
??查看自己谷歌瀏覽器的版本,我這里的版本是正式版本116.0.5845.188,驅動下載地址最新的只有114.0.5735.90,所以只能去官網的測試頁面下載118.0.5993.70版本的驅動(https://googlechromelabs.github.io/chrome-for-testing/#stable,版本向下兼容),然后把下載的壓縮包解壓,將exe文件放入 PyCharm 項目的根目錄下。
??之后執行pip install selenium命令,安裝 selenium 庫。
4. Selenium的使用
from selenium import webdriver# 創建瀏覽器操作對象
path = 'chromedriver.exe'
browser= webdriver.Chrome(path)# 訪問網站
url = 'https://www.baidu.com'browser.get(url)
# content = browser.page_source
# print(content)
??需要注意的是,如果你的 selenium 是4.11.2以上的版本,不需要設置driver.exe的路徑,selenium 可以自己處理瀏覽器的驅動程序,因此代碼直接改為brower = webdriver.Chrome()即可。
??運行代碼,得到下面的效果:
5. Selenium的元素定位
??自動化工具要做的就是模擬鼠標和鍵盤來操作點擊、輸入等等元素,但是操作這些元素的前提是找到它們,WebDriver 提供了很多元素定位的方法:
- ?根據標簽 id 獲取元素:
from selenium import webdriver
from selenium.webdriver.common.by import By# 創建瀏覽器操作對象
# path = 'chromedriver.exe'
browser= webdriver.Chrome()# 訪問網站
url = 'https://www.baidu.com'
browser.get(url)button = browser.find_element(By.ID, 'su')
# button = browser.find_elements(By.ID, 'su')
print(button)
- 根據標簽 name 屬性的值獲取元素:
button = browser.find_element(By.NAME, 'wd')
print(button)
- 根據 Xpath 語句獲取元素;
button = browser.find_element(By.XPATH, '//input[@id="su"]')
print(button)
- 根據標簽名獲取元素:
button = browser.find_elements(By.TAG_NAME, 'input')
print(button)
- 根據 bs4 語法獲取元素:
button = browser.find_elements(By.CSS_SELECTOR, '#su')
print(button)
- 根據標簽的文本獲取元素(精確定位):
button = browser.find_elements(By.LINK_TEXT, '地圖')
print(button)
- 根據標簽的文本獲取元素(模糊定位):
button = browser.find_elements(By.PARTIAL_LINK_TEXT, '地')
print(button)
- 根據 class 屬性獲取元素:
button = browser.find_element(By.CLASS_NAME, 'wrapper_new')
print(button)
??當我們定位到元素之后,自然就要考慮如何獲取到元素的各種信息,selenium 給我們提供了獲取元素不同信息的方法:
- 獲取元素屬性:
from selenium import webdriver
from selenium.webdriver.common.by import By# 創建瀏覽器操作對象
# path = 'chromedriver.exe'
browser= webdriver.Chrome()# 訪問網站
url = 'https://www.baidu.com'
browser.get(url)button = browser.find_element(By.ID, 'su')
print(input.get_attribute('class'))
- 獲取元素標簽名:
input = browser.find_element(By.ID, 'su')
print(input.tag_name)
- 獲取元素文本:
input = browser.find_element(By.ID, 'su')
print(input.text)
- 獲取元素位置:
input = browser.find_element(By.ID, 'su')
print(input.location)
- 獲取元素大小:
input = browser.find_element(By.ID, 'su')
print(input.size)
6. Selenium的交互
??頁面交互指的是我們平時在瀏覽器上的各種操作,比如輸入文本、點擊鏈接、回車、下拉框等,下面就演示 selenium 是如何進行頁面交互的。
#!/usr/bin/env python2.7
# -*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import sysdef test(types):# 創建瀏覽器操作對象# path = 'chromedriver.exe'# 訪問網站url = 'https://www.baidu.com'browser.get(url)if types=='輸入文本':# 定位輸入框input = browser.find_element(By.ID, 'kw')# 輸入文本seleniuminput.send_keys('selenium')time.sleep(2)elif types=='點擊':# 定位輸入框input = browser.find_element(By.ID, 'kw')# 輸入文本seleniuminput.send_keys('selenium')time.sleep(2)# 定位百度一下的按鈕button = browser.find_element(By.ID, 'su')# 點擊按鈕button.click()time.sleep(2)elif types=='清除文本':# 訪問網站url = 'https://www.baidu.com'browser.get(url)# 定位輸入框input = browser.find_element(By.ID, 'kw')# 輸入文本seleniuminput.send_keys('selenium')time.sleep(2)# 清除seleniuminput.clear()time.sleep(2)elif types=='回車確認':# 訪問網站url = 'https://www.baidu.com'browser.get(url)# 定位輸入框input = browser.find_element(By.ID, 'kw')# 輸入文本seleniuminput.send_keys('selenium')time.sleep(2)# 回車查詢input.submit()time.sleep(2)elif types=='運行JavaScript':# 訪問網站url = 'https://www.baidu.com'browser.get(url)# 定位輸入框input = browser.find_element(By.ID, 'kw')# 輸入文本seleniuminput.send_keys('selenium')time.sleep(2)# 回車查詢input.submit()time.sleep(2)# js代碼js_bottom = 'document.documentElement.scrollTop=100000'# 下拉進度條,頁面滑動browser.execute_script(js_bottom)time.sleep(2)elif types=='前進后退': # 定位輸入框input = browser.find_element(By.ID, 'kw')# 輸入文本seleniuminput.send_keys('selenium')time.sleep(2)# 回車查詢input.submit()time.sleep(2)# js代碼js_bottom = 'document.documentElement.scrollTop=100000'# 頁面滑動browser.execute_script(js_bottom)time.sleep(2)# 定位下一頁的按鈕next = browser.find_element(By.XPATH, '//a[@class="n"]')# 點擊下一頁next.click()time.sleep(2)# 返回到上一頁面browser.back()time.sleep(2)# 前進到下一頁browser.forward()time.sleep(2)else:print "請輸入正確的指令: 1.輸入文本 2.點擊 3.清除文本 4.回車確認 5.運行JavaScript 6.前進后退"time.sleep(2)# 關閉瀏覽器browser.close()if __name__ == '__main__':browser = webdriver.Chrome(executable_path='/Users/wuwei/Desktop/soft/chromedriver')gettypes=sys.argv[1]# 運行示例:python seleniumtest.py '輸入文本'test(gettypes)