Selenium

2022-04-22

  • install:: pip3 install selenium
  • import:: from selenium import webdriver
  • doc:: Selenium

类似: Selenium Wire

前提

安装 Chrome

  • macOS

    brew install google-chrome
  • CentOS :

    yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
  • Ubuntu :

    wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
    • sudo dpkg -i google-chrome*.deb

安装完成后通过 googlechrome --version 查看版本号

下载 Chromedriver

Terminal window
1
# 获取版本
2
LATEST=$(wget -q -O - http://chromedriver.storage.googleapis.com/LATEST_RELEASE)
3
wget http://chromedriver.storage.googleapis.com/$LATEST/chromedriver_linux64.zip
4
# 解压
5
unzip chromedriver_linux64.zip
6
# 赋予执行权限
7
chmod +x chromedriver
8
# 拷贝指定目录
9
sudo mv chromedriver /usr/local/bin/
10
11
# 查看版本号
12
chromedriver --version

自动安装管理

Terminal window
1
pip install webdriver-manager

使用

1
# selenium 4
2
from selenium import webdriver
3
from selenium.webdriver.chrome.service import Service as ChromeService
4
from webdriver_manager.chrome import ChromeDriverManager
5
6
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

注:下载会使用 googleapis.com 地址,需先修改对应 hosts

配置

  • 位置:/usr/local/bin/chromedriver

    macOS

  • 配置路径:`webdriver.Chrome(executable_path=‘/usr/local/bin/chromedriver’)

功能参数

日志

1
from pping import pping
2
from selenium.webdriver import DesiredCapabilities
3
4
caps = {
5
'goog:loggingPrefs': {'performance': 'ALL'} # 记录性能日志
6
}
7
driver = webdriver.Chrome(desired_capabilities=caps)
8
9
driver.get('https://httpbin.org/get')
10
logs = driver.get_log("performance")
11
for item in logs:
12
log = json.loads(item["message"])["message"]
13
pprint(log)

定位元素

find_element()

  • ID: “id”
  • XPATH: “xpath”
  • LINK_TEXT: “link text”
  • PARTIAL_LINK_TEXT: “partial link text”
  • NAME: “name”
  • TAG_NAME: “tag name”
  • CLASS_NAME: “class name”
  • CSS_SELECTOR: “css selector”
1
from selenium.webdriver.common.by import By
2
3
driver.find_element(By.XPATH, '//button[text()="Some text"]')
4
driver.find_elements(By.XPATH, '//button')

单元素

  • find_element_by_link_text: 链接
  • find_element_by_partial_link_text: 链接(可部分匹配)
  • find_element_by_tag_name: 标签名
  • find_element_by_css_selector: CSS 选择器
  • find_element_by_id: 根据 ID 获取 driver.find_element_by_id('id').get_attribute() (未测试)
  • find_element_by_class_name: 根据类名
  • find_element_by_name: 根据名称
  • find_element_by_xpath driver.find_element_by_xpath('/html/head/title').text :获取指定标签下的文本数据(字符串)

多元素

将返回列表

  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector

API

  • driver.page_source :查看网页源码
  • click(): 点击

等待

1
# 强制等待
2
time.sleep(10)
3
# 隐式等待(只需设置一次,对整个 driver 周期有效)
4
driver.implicitly_wait(10) # 最长等 10秒
5
# 显式等待

问题

  • 法打开“chromedriver”,因为无法验证开发者。 解决:xattr -d com.apple.quarantine /usr/local/bin/chromedriver

参考