Selenium 是一个用于自动化 web 浏览器的工具。它可以模拟用户在浏览器中的各种操作,如点击、输入文本、导航等,从而帮助你进行自动化测试、数据抓取和网页操作等任务。以下列举一些应用场景:
自动化测试:自动化测试是 Selenium 最常见的用例之一。它允许你编写测试脚本来模拟用户的操作,测试 web 应用的功能是否正常。
数据抓取:Selenium 可以用于抓取网页上的数据,特别是那些使用 JavaScript 动态加载内容的网站。它能处理动态内容和复杂的用户交互,这比使用纯粹的 HTTP 请求要方便得多。
网站交互:你可以使用 Selenium 自动化一些重复性的网页操作,比如填充表单、点击按钮、导航等。
性能监控:Selenium 可以用于性能测试,通过模拟用户行为来监控网页的加载时间和响应速度。
学习和实验:Selenium 也可以用于学习如何与网页交互,帮助开发者理解前端技术。
提示:以下是本篇文章正文内容,下面内容可供参考
在学习selenium操作时,我们需要将selenium库及对应浏览器驱动配置好。可以参考下面链接进行安装配置:
详细流程——selenium+Edge浏览器驱动下载
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Edge()
driver.get('https://www.baidu.com')
# 等待十秒,关闭浏览器
time.sleep(10)
driver.quit()
find_element() 方法是 Selenium WebDriver 的一种通用方式来查找单个元素。你可以使用它配合不同的定位策略。示例如下:
1.通过 ID 查找:
element = driver.find_element(By.ID, "element_id")
2.通过类名查找:
element = driver.find_element(By.CLASS_NAME, "class_name")
3.通过名称查找:
element = driver.find_element(By.NAME, "element_name")
4.通过 XPath 查找:
element = driver.find_element(By.XPATH, "//tag[@attribute='value']")
5.通过 CSS 选择器查找:
element = driver.find_element(By.CSS_SELECTOR, "css_selector")
注意:在使用 find_element() 时,需要先导入 By 模块:
from selenium.webdriver.common.by import By
在 Selenium 中,操作元素的方法包括点击、输入文本、获取属性值等。下面是一些常用的方法和示例:
element.click()
element.send_keys("text")
element.clear()
text = element.text
attribute_value = element.get_attribute("attribute_name")
css_value = element.value_of_css_property("property_name")
tag_name = element.tag_name
location = element.location # 返回一个包含 x 和 y 的字典
size = element.size # 返回一个包含 width 和 height 的字典
is_displayed = element.is_displayed()
代码如下(示例):
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Edge()
driver.get('https://www.baidu.com')
el0 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')
el0.send_keys("what can I say")
el1 = driver.find_element(By.XPATH, value='//*[@id="su"]')
el1.click()
time.sleep(10)
driver.quit()
Selenium 支持无头浏览器模式,这样可以在后台运行浏览器而不显示图形用户界面。这对于运行自动化测试或进行网页抓取时特别有用。无头浏览器可以显著提高测试运行速度,并节省系统资源。
from selenium import webdriver
from selenium.webdriver.edge.options import Options
# 创建 Edge 配置对象
edge_options = Options()
edge_options.add_argument("--headless") # 启用无头模式
# 启动 Edge 浏览器
driver = webdriver.Edge(options=edge_options)
# 打开网页
driver.get("https://news.sina.com.cn/")
# 进行操作
print(driver.title) # 打印网页标题
# 关闭浏览器
driver.quit()
在 Selenium 中,窗口切换是一个常见操作,尤其是在处理多个浏览器窗口或标签页时。Selenium 提供了一些方法来帮助你在这些窗口或标签页之间切换。下面是一些常用的窗口切换方法及其示例:
当你点击一个链接或按钮时,它可能会打开一个新的窗口或标签页。你可以使用 window_handles 方法获取所有打开的窗口句柄,然后切换到新窗口。
示例代码:
from selenium import webdriver
# 启动浏览器
driver = webdriver.Edge()
# 打开网页
driver.get("https://www.example.com")
# 保存当前窗口句柄
original_window = driver.current_window_handle
# 执行会打开新窗口的操作(例如点击链接)
driver.find_element(By.LINK_TEXT, "Open New Window").click()
# 获取所有窗口句柄
all_windows = driver.window_handles
# 切换到新打开的窗口
for window in all_windows:
if window != original_window:
driver.switch_to.window(window)
break
# 进行操作
print(driver.title) # 打印新窗口的标题
# 关闭新窗口
driver.close()
# 切换回原窗口
driver.switch_to.window(original_window)
# 关闭浏览器
driver.quit()
如果你知道要切换到哪个窗口,可以使用 switch_to.window 方法直接切换到目标窗口的句柄。
# 获取所有窗口句柄
all_windows = driver.window_handles
# 假设我们要切换到第一个窗口
driver.switch_to.window(all_windows[0])
在有嵌套框架 iframe 的情况下,你可以切换到特定的框架进行操作。
# 切换到指定的框架(通过框架的名称或 ID)
driver.switch_to.frame("frame_id_or_name")
# 在框架内执行操作
driver.find_element(By.ID, "element_inside_frame").click()
# 切换回主文档
driver.switch_to.default_content()
如果你需要处理浏览器弹出的警告框或确认框,你可以使用 switch_to.alert 方法。
from selenium.webdriver.common.alert import Alert
# 触发弹出警告框
driver.find_element(By.ID, "trigger_alert").click()
# 切换到警告框
alert = driver.switch_to.alert
# 获取警告框文本
print(alert.text)
# 接受警告框
alert.accept()
# 关闭浏览器
driver.quit()
window_handles:获取所有窗口句柄。
switch_to.window(handle):切换到指定窗口。
switch_to.frame(name_or_id):切换到指定框架。
switch_to.default_content():切换回主文档。
switch_to.alert:切换到弹出的警告框。
这些方法可以帮助你在不同的窗口、标签页、框架和弹出窗口之间进行切换,使得自动化操作更加灵活和全面。
在 Selenium 中,有两种主要的页面等待方式:隐式等待和显式等待。
隐式等待设置了一个全局的等待时间,Selenium 会在查找元素时等待指定的时间,直到元素出现为止。如果在超时时间内找到了元素,则立即继续执行,如果超时则抛出异常。
示例代码:
from selenium import webdriver
# 启动浏览器
driver = webdriver.Chrome()
# 设置隐式等待时间
driver.implicitly_wait(10) # 等待最多 10 秒
# 打开网页
driver.get("https://www.example.com")
# 查找元素
element = driver.find_element(By.ID, "element_id")
# 关闭浏览器
driver.quit()
显式等待是一种更精确的等待方式,用于等待特定的条件成立。你可以设置条件,比如元素可见、元素可点击等,直到条件成立或超时。
示例代码:
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
# 启动浏览器
driver = webdriver.Chrome()
# 打开网页
driver.get("https://www.example.com")
# 创建 WebDriverWait 对象
wait = WebDriverWait(driver, 10) # 最长等待 10 秒
# 等待元素可见
element = wait.until(EC.visibility_of_element_located((By.ID, "element_id")))
# 进行操作
element.click()
# 关闭浏览器
driver.quit()
隐式等待:适用于所有查找操作,简单易用,但无法精确控制等待条件。
显式等待:适用于需要等待特定条件的操作,更加灵活和精确,适合处理动态页面元素。
通常,显式等待比隐式等待更具针对性和灵活性,建议在处理复杂页面加载时优先使用显式等待。
结合selenium的相关基础知识,我们可以进行控制浏览器播放网易云音乐热歌榜歌曲的综合小练习。首先加载Edge浏览器,然后向搜索框输入搜索网易云音乐,再进行元素定位点击进入网易云音乐网站,进入热歌榜。注意网易云音乐网站内有嵌套框架iframe,我们需要在框架内定位播放按钮并点击,这就是整个代码的过程。下面代码可以正常运行,但代码有很大优化空间,如:封装函数,优化等待。
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Edge()
driver.get('https://www.baidu.com')
el0 = driver.find_element(by=By.XPATH, value='//*[@id="kw"]')
el0.send_keys("网易云音乐")
el1 = driver.find_element(By.XPATH, value='//*[@id="su"]')
el1.click()
time.sleep(3)
el3 = driver.find_element(By.XPATH, value='//*[@id="1"]/div/h3/a[1]')
el3.click()
# 跳转至最新窗口
all_windows = driver.window_handles
driver.switch_to.window(all_windows[-1])
time.sleep(3)
# 页面内寻找
el4 = driver.find_element(By.XPATH, value='//*[@id="g_nav2"]/div/ul/li[2]/a')
el4.click()
time.sleep(2)
# 在iframe框架内执行操作
driver.switch_to.frame("contentFrame")
driver.find_element(By.XPATH, '//*[@id="toplist"]/div[1]/div/ul[1]/li[4]/div/p[1]/a').click()
time.sleep(3)
# 寻找并点击播放键
driver.find_element(By.XPATH, '//*[@id="toplist"]/div[2]/div/div[1]/div/div[2]/div/div[3]/a[1]').click()
以上是本文介绍selenium自动化测试网页基础操作的内容,Selenium 是一个功能强大且灵活的工具,适用于 Web 应用程序的自动化测试。然而,它也有一些局限性,如速度慢和处理动态内容的复杂性。选择是否使用 Selenium 需要根据项目的需求和环境来决定。