📅  最后修改于: 2023-12-03 15:36:36.685000             🧑  作者: Mango
在开发 Web 自动化测试、爬虫、数据收集等应用时,我们通常需要通过自动化控制 Web 浏览器(比如 Chrome、Firefox、PhantomJS 等)来模拟人类用户的操作,进行页面的自动化测试、信息的自动收集等;而 Python 是一门功能强大的高级编程语言,可以通过各种库和工具来实现对 Web 浏览器的自动化控制。
Python 中有许多可以用来控制 Web 浏览器的库和工具,其中最为常用的包括:
在这些库中,Selenium 和 Splinter 是最为常用和强大的,均提供了针对 Web 应用和浏览器的完整控制,而且可以轻易地实现自动化测试、数据采集和网站爬虫等操作。
在使用 Selenium 时,首先需要安装 Selenium 库:
!pip install selenium
同时,还需要下载并安装浏览器驱动:
选择对应的浏览器驱动下载并解压,然后将其所在路径添加到系统 Path 环境变量中,例如:
import os
os.environ["PATH"] += os.pathsep + "D:/Downloads/webdriver"
启动和关闭浏览器非常简单,可以通过以下命令完成:
from selenium import webdriver
# 启动 Chrome 浏览器
browser = webdriver.Chrome()
# 启动 Firefox 浏览器
browser = webdriver.Firefox()
# 关闭浏览器
browser.quit()
启动浏览器后,我们通常需要访问指定的网页:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
这里我们以百度首页为例。
Selenium 提供了一系列方法来查找 Web 页面中的元素,包括 ID、tag name、class name、name、link text、partial link text、XPath 和 CSS selector 等等。
这里以百度首页的搜索输入框为例:
<input type="text" class="s_ipt" name="wd" maxlength="255" autocomplete="off">
我们可以通过以下代码完成查找:
from selenium.webdriver.common.by import By
# 通过 ID 查找元素
el = browser.find_element(by=By.ID, value="kw")
# 通过 name 查找元素
el = browser.find_element(by=By.NAME, value="wd")
# 通过 class name 查找元素
el = browser.find_element(by=By.CLASS_NAME, value="s_ipt")
# 通过 tag name 查找元素
el = browser.find_element(by=By.TAG_NAME, value="input")
# 通过 link text 查找元素
el = browser.find_element(by=By.LINK_TEXT, value="hao123")
# 通过部分 link text 查找元素
el = browser.find_element(by=By.PARTIAL_LINK_TEXT, value="新闻")
# 通过 XPath 查找元素
el = browser.find_element(by=By.XPATH, value="//input[@name='wd']")
# 通过 CSS selector 查找元素
el = browser.find_element(by=By.CSS_SELECTOR, value="input.s_ipt[name='wd']")
当找到元素后,我们可以对其进行各种操作:
# 输入文字
el.send_keys("Python")
# 点击元素
el.click()
# 清空输入框
el.clear()
在实际应用中,可能需要等待 Web 页面中的某个元素加载结束后再进行后续操作,这时可以使用 Selenium 的等待工具,包括隐式等待和显式等待。
隐式等待是指在一个固定时间内页面中的所有元素都加载后再执行后续操作,通过设置 implicit_wait
属性即可实现:
browser.implicitly_wait(10)
这里的 10
表示等待的最长时间为 10 秒。
显式等待是指在页面中等待指定元素的加载完成后再执行后续操作,可以通过 WebDriverWait
类以及 expected_conditions
模块中的条件实现:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
el = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.ID, "kw"))
)
这里表示等待 ID 为 kw
的元素加载完成后再进行后续操作,最长等待时间为 10 秒。
下面是一个使用 Selenium 控制 Chrome 浏览器,访问百度并进行搜索操作的示例程序:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get("https://www.baidu.com")
el = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.ID, "kw"))
)
el.send_keys("Python")
el.submit()
browser.quit()