一、selenium 介绍

Selenium 是一个用于自动化浏览器操作的开源框架。它可以模拟用户在浏览器中的操作,例如点击链接、填写表单、提交数据、浏览网页等。Selenium 最初是为了进行 Web 应用程序的功能测试和自动化测试而创建的,但后来也被广泛用于 Web 数据抓取、网页截图生成、自动化任务执行等领域。

二、安装 selenium

Selenium 的安装环境主要有两个 客户端库 和 浏览器 驱动。

1.安装客户端库

pip install selenium

豆瓣源

pip install selenium -i https://pypi.douban.com/simple/

2.安装浏览器和驱动

推选使用Google Chrome浏览器
下载地址:https://www.google.cn/chrome/

Chrome浏览器安装好以后,下载 Chrome 浏览器的驱动。
下载地址:https://chromedriver.storage.googleapis.com/index.html

opPUYeahtmjOyFOLF7ja

注:浏览器驱动,需要和浏览器版本匹配,小版本差别不会有啥问题。

OjI9pZKLkxhdWlRU7exz

里面有3个压缩包,分别对应Linux、Mac、Windows平台。
Windows平台的电脑下载 chromedriver_win32.zip
下载之后解压将 chromedriver.exe 到某个目录下面
注:这个目录的路径最好是没有中文名和空格的。

Edge 浏览器下载驱动:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

三、简单示例

# 导入所需的库
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 创建 Chrome WebDriver 实例,并指定 Chrome Driver 的路径
driver = webdriver.Chrome(service=Service(r'C:\Program Files\Google\Chrome\Application\chromedriver.exe'))

# 打开指定的网页
driver.get('https://blog.n1l.cn')

# 关闭 WebDriver
driver.quit()

执行上面这行代码时,自动化程序就发起了打开百度网址的请求消息 ,通过浏览器驱动, 给 Chrome 浏览器。
Chome 浏览器接收到该请求后,就会打开百度网址,通过浏览器驱动, 告诉自动化程序 打开成功。

四、元素定位

可以通过使用浏览器的开发者工具进行对元素的快速定位。

注:Selenium 升级到版本 4 以后,不支持 find_element_by* 方法。
如:

  • id定位:find_element_by_id()
  • name定位:find_element_by_name()
  • class定位:find_element_by_class_name()
  • link定位:find_element_by_link_text() partial
  • link定位:find_element_by_partial_link_text()
  • tag定位:find_element_by_tag_name()
  • xpath定位:find_element_by_xpath()
  • css定位:find_element_by_css_selector()

根据 ID 定位

# 导入所需的库
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

# 创建 Chrome WebDriver 实例,并指定 Chrome Driver 的路径
driver = webdriver.Chrome(service=Service(r'C:\Program Files\Google\Chrome\Application\chromedriver.exe'))

# 打开指定的网页
driver.get('https://blog.n1l.com')

# 根据 id 定位元素,返回的就是该元素对应的 WebElement 对象
element = driver.find_element(By.ID, 'userTable')

# 关闭 WebDriver
driver.quit()

根据 name 定位

# 根据 name 定位元素,返回的就是该元素对应的 WebElement 对象
element = driver.find_element(By.NAME, 'username')

根据 class 定位

# 根据 class 定位元素,返回的就是该元素对应的 WebElement 对象
element = driver.find_element(By.CLASS_NAME, 'layui-btn')

根据 tag 定位

# 根据 class 定位元素,返回的就是该元素对应的 WebElement 对象
element = driver.find_element(By.tag_NAME, 'div')

根据 Xpath 定位

# 根据 class 定位元素,返回的就是该元素对应的 WebElement 对象
element = driver.find_element(By.XPATH, "//form[@class='layui-anim layui-anim-upbit']/ul/li[@class='verify']/img")

find_element 和 find_elements 的区别

find_element:
用于查找单个元素,即匹配到的第一个符合条件的元素。
如果找到符合条件的元素,则返回该元素的 WebDriver 对象。
如果找不到符合条件的元素,会抛出 NoSuchElementException 异常。

find_elements:
用于查找多个元素,即匹配到的所有符合条件的元素。
如果找到符合条件的元素,则返回一个包含所有元素的列表,每个元素都是一个 WebDriver 对象。
如果找不到符合条件的元素,返回一个空列表,而不会抛出异常。

from selenium import webdriver

# 创建 Chrome WebDriver 实例
driver = webdriver.Chrome()

# 打开网页
driver.get('https://www.example.com')

# 使用 find_element 查找单个元素,如果找不到会抛出异常
single_element = driver.find_element('css selector', '.my-class')

# 使用 find_elements 查找多个元素,即使找不到也会返回空列表
multiple_elements = driver.find_elements('xpath', '//div[@class="other-class"]')

# 关闭 WebDriver
driver.quit()

总结:

使用 find_element 用于定位单个元素,如果找不到会抛出异常。
使用 find_elements 用于定位多个元素,即使找不到也会返回空列表。

五、控制元素

点击元素

click() 是 Selenium WebDriver 提供的一个方法,用于模拟用户在一个元素上执行鼠标左键点击操作。

element = driver.find_element(By.CLASS_NAME, 'layui-btn')
element.click()

输入框

send_keys() 是 Selenium WebDriver 提供的一个方法,用于向输入框(文本框、密码框等)或其他可以接收键盘输入的元素发送文本。

element = driver.find_element(By.NAME, 'username')
element.clear() # 清除输入框已有的字符串
element.send_keys('admin') # 输入新字符串

六、获取元素信息

获取元素文本内容

text() 属性会返回元素可见的文本内容,但不会返回隐藏元素的文本内容。

element = driver.find_element(By.ID, 'userTable')
print(element.text())

get_attribute('textContent') 方法会返回元素的所有文本内容,包括隐藏元素的内容。

element = driver.find_element(By.ID, 'userTable')
print(element.get_attribute('textContent'))

要获取元素属性 class 的值,就可以使用 element.get_attribute('class')

获取HTML内容

element.get_attribute('outerHTML'):

用于获取元素及其所有子元素的 HTML 内容,包括元素本身的标签。
返回的是包含整个元素的 HTML 字符串,包括开始标签、属性、子元素、结束标签等。

element.get_attribute('innerHTML'):

用于获取元素内部的 HTML 内容,不包括元素本身的标签。
返回的是元素内部的 HTML 字符串,即去除了开始标签和结束标签的部分。

获取文本内容 2

element.get_attribute('innerText') 是 Selenium WebDriver 提供的方法之一,用于获取元素的可见文本内容,类似于浏览器中 JavaScript 中的 innerText 属性。

# 获取元素的可见文本内容
element_text = element.get_attribute('innerText')
print(element_text)

element.get_attribute('textContent') 是 Selenium WebDriver 提供的方法之一,用于获取元素的全部文本内容,包括隐藏元素的内容,类似于浏览器中 JavaScript 中的 textContent 属性。

# 获取元素的全部文本内容
element_text = element.get_attribute('textContent')
print(element_text)

七、Xpath选择器

分享一个好用的Xpath浏览器插件能够快速的生成Xpath
gztbw52CelsGmRlc59P1
按住 Shift 可以使用鼠标快速定位
ibGuzGJ6co9tSMDAsGGZ

八、浏览器安全

可以使用 Selenium WebDriver 中的 Options 对象来配置浏览器的参数,以便在打开网页时忽略 SSL 错误和证书错误。

--ignore-ssl-errors=yes:该参数指示浏览器忽略 SSL 错误,即使网站的 SSL 证书存在问题,也会继续加载页面。
--ignore-certificate-errors:该参数用于忽略证书错误,这意味着浏览器将忽略证书的有效性问题,仍然加载页面。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# 创建 Chrome WebDriver 的 Options 对象
options = Options()

# 添加参数来忽略 SSL 错误和证书错误
options.add_argument('--ignore-ssl-errors=yes')
options.add_argument('--ignore-certificate-errors')

# 创建带有配置选项的 Chrome WebDriver 实例
driver = webdriver.Chrome(options=options)

# 打开网页
driver.get('https://blog.n1l.cn')

# 关闭 WebDriver
driver.quit()
最后修改:2023 年 10 月 26 日
如果觉得我的文章对你有用,请随意赞赏