selenium操作

selenium介绍

  开发使用有头浏览器,部署使用无界面浏览器

selenium工作原理

  利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)

selenium模块与driver的安装

  • 安装 Selenium 模块
pip install selenium
  • 下载浏览器驱动

  Selenium 需要一个浏览器驱动程序来与浏览器进行通信。以下是一些常用浏览器的驱动程序下载地址:

ChromeDriver(用于 Google Chrome): ChromeDriver 下载链接

 

EdgeDriver用于 Microsoft Edge): EdgeDriver 下载链接

下载合适的驱动程序后,将其解压并放置在你的系统 PATH 中,或者记下其路径以便稍后使用。

  • 设置并启动浏览器

  安装好 Selenium 模块和浏览器驱动后,可以编写脚本来启动浏览器。以下是一个简单的示例,展示如何使用 ChromeDriver 启动 Chrome 浏览器:

 

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# 指定 ChromeDriver 的路径(如果不在系统 PATH 中)
driver_path = 'path/to/chromedriver'

# 初始化 Chrome 浏览器
driver = webdriver.Chrome(executable_path=driver_path)

# 访问一个网站
driver.get('http://www.google.com')

# 查找搜索框元素,并输入一些文本
search_box = driver.find_element(By.NAME, 'q')
search_box.send_keys('Selenium')
search_box.send_keys(Keys.RETURN)

# 关闭浏览器
driver.quit()
  • 添加驱动路径到系统 PATH(可选)

  如果不想每次都指定驱动路径,可以将驱动程序的路径添加到系统 PATH 中:

  Windows

  1. 右键点击“此电脑”,选择“属性”。
  2. 点击“高级系统设置”。
  3. 点击“环境变量”。
  4. 在“系统变量”中,找到 Path,并点击“编辑”。
  5. 点击“新建”,并输入驱动程序的路径。
  6. 确认并保存所有对话框。

 

driver属性和方法

属性

属性描述示例
current_url 获取当前页面的 URL url = driver.current_url
title 获取当前页面的标题 title = driver.title
page_source 获取当前页面的源代码 page_source = driver.page_source
current_window_handle 获取当前窗口的句柄 current_window = driver.current_window_handle
window_handles 获取所有打开窗口的句柄 windows = driver.window_handles

方法

方法描述示例
get(url) 打开指定的 URL driver.get('http://www.example.com')
find_element(by, value) 查找单个元素 element = driver.find_element(By.ID, 'element_id')
find_elements(by, value) 查找多个元素 elements = driver.find_elements(By.CLASS_NAME, 'element_class')
close() 关闭当前窗口 driver.close()
quit() 关闭所有窗口并退出浏览器 driver.quit()
back() 导航到浏览器历史记录中的前一个页面 driver.back()
forward() 导航到浏览器历史记录中的下一个页面 driver.forward()
refresh() 刷新当前页面 driver.refresh()
execute_script(script, *args) 在当前页面上执行 JavaScript driver.execute_script("alert('Hello World!');")
get_screenshot_as_file(filename) 截取当前页面的截图并保存到文件中 driver.get_screenshot_as_file('screenshot.png')
switch_to 切换到不同的上下文(如 iframe 或窗口) driver.switch_to.frame('frame_name')<br>driver.swit

 

元素定位

定位方式

定位方式描述示例
By.ID 通过元素的 id 属性定位 element = driver.find_element(By.ID, 'element_id')
By.NAME 通过元素的 name 属性定位 element = driver.find_element(By.NAME, 'element_name')
By.CLASS_NAME 通过元素的 class 属性定位 element = driver.find_element(By.CLASS_NAME, 'class_name')
By.TAG_NAME 通过元素的标签名定位 element = driver.find_element(By.TAG_NAME, 'tag_name')
By.LINK_TEXT 通过元素的链接文本定位 element = driver.find_element(By.LINK_TEXT, 'link_text')
By.PARTIAL_LINK_TEXT 通过元素的部分链接文本定位 element = driver.find_element(By.PARTIAL_LINK_TEXT, 'partial_text')
By.CSS_SELECTOR 通过 CSS 选择器定位元素 element = driver.find_element(By.CSS_SELECTOR, 'css_selector')
By.XPATH 通过 XPath 表达式定位元素 element = driver.find_element(By.XPATH, 'xpath_expression')

示例代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 打开 Google
driver.get('http://www.google.com')

# 通过 ID 定位
search_box_by_id = driver.find_element(By.ID, 'lst-ib')

# 通过 Name 定位
search_box_by_name = driver.find_element(By.NAME, 'q')

# 通过 Class Name 定位
search_box_by_class_name = driver.find_element(By.CLASS_NAME, 'gsfi')

# 通过 Tag Name 定位
input_elements_by_tag_name = driver.find_elements(By.TAG_NAME, 'input')

# 通过 Link Text 定位
link_by_text = driver.find_element(By.LINK_TEXT, 'About')

# 通过 Partial Link Text 定位
link_by_partial_text = driver.find_element(By.PARTIAL_LINK_TEXT, 'Abo')

# 通过 CSS Selector 定位
search_box_by_css_selector = driver.find_element(By.CSS_SELECTOR, 'input[name="q"]')

# 通过 XPath 定位
search_box_by_xpath = driver.find_element(By.XPATH, '//input[@name="q"]')

# 输入搜索关键字
search_box_by_name.send_keys('Selenium')
search_box_by_name.send_keys(Keys.RETURN)

# 关闭浏览器
driver.quit()

 

定位多个元素

有时需要定位页面上的多个元素,使用 find_elements 方法:

# 定位所有的输入框
input_boxes = driver.find_elements(By.TAG_NAME, 'input')

for box in input_boxes:
    print(box.get_attribute('name'))

元素操作

常见操作

操作描述示例
click() 点击元素 element.click()
send_keys(*value) 向元素发送文本或键盘输入 element.send_keys('text')
clear() 清除元素中的内容(通常用于输入框) element.clear()
submit() 提交表单(通常用于表单中的输入框或按钮) element.submit()
get_attribute(name) 获取元素的属性值 value = element.get_attribute('attribute_name')
get_property(name) 获取元素的属性值(区别于 get_attribute value = element.get_property('property_name')
text 获取元素的文本内容 text = element.text
is_displayed() 判断元素是否可见 is_visible = element.is_displayed()
is_enabled() 判断元素是否可用 is_enabled = element.is_enabled()
is_selected() 判断元素是否被选中(通常用于复选框或单选按钮) is_selected = element.is_selected()
screenshot(filename) 截取元素的截图并保存到文件 element.screenshot('element.png')

示例代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 打开 Google
driver.get('http://www.google.com')

# 通过 Name 定位搜索框
search_box = driver.find_element(By.NAME, 'q')

# 清除搜索框中的内容
search_box.clear()

# 向搜索框发送文本
search_box.send_keys('Selenium')

# 模拟回车键提交搜索
search_box.send_keys(Keys.RETURN)

# 等待搜索结果加载并获取第一个结果
driver.implicitly_wait(10)
first_result = driver.find_element(By.XPATH, '//h3')

# 获取第一个结果的文本
result_text = first_result.text
print(result_text)

# 点击第一个结果
first_result.click()

# 截取当前页面截图
driver.save_screenshot('search_result.png')

# 关闭浏览器
driver.quit()

标签切换

  在使用 Selenium 进行浏览器自动化时,有时需要在多个标签页(或窗口)之间切换。Selenium 提供了一些方法,可以帮助你处理这些操作。以下是关于如何在标签页之间切换的详细指南:

获取当前窗口句柄

每个窗口或标签页都有一个唯一的句柄,可以使用 driver.current_window_handle 获取当前窗口的句柄。

current_handle = driver.current_window_handle print(current_handle)

获取所有窗口句柄

可以使用 driver.window_handles 获取所有打开的窗口句柄。

handles = driver.window_handles print(handles)

切换到指定窗口

使用 driver.switch_to.window(handle) 方法可以切换到指定的窗口。

# 获取所有窗口句柄
handles = driver.window_handles

# 切换到新窗口
driver.switch_to.window(handles[1])

# 切换回原窗口
driver.switch_to.window(handles[0])

示例代码

以下是一个示例代码,展示如何打开一个新标签页并在标签页之间切换:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 打开第一个网站
driver.get('http://www.google.com')

# 获取当前窗口句柄
main_window = driver.current_window_handle

# 打开一个新标签页
driver.execute_script("window.open('http://www.bing.com', '_blank');")

# 等待新标签页加载
time.sleep(3)

# 获取所有窗口句柄
handles = driver.window_handles

# 切换到新标签页
driver.switch_to.window(handles[1])

# 在新标签页中执行操作
search_box = driver.find_element(By.NAME, 'q')
search_box.send_keys('Selenium')
search_box.send_keys(u'\ue007')  # 模拟回车键

# 等待搜索结果加载
time.sleep(3)

# 截取新标签页的截图
driver.save_screenshot('bing_search_result.png')

# 切换回原窗口
driver.switch_to.window(main_window)

# 截取原窗口的截图
driver.save_screenshot('google_home.png')

# 关闭浏览器
driver.quit()

关闭指定窗口

可以使用 driver.close() 关闭当前窗口,并使用 driver.quit() 关闭所有窗口。

# 切换到新窗口并关闭它
driver.switch_to.window(handles[1])
driver.close()

# 切换回原窗口
driver.switch_to.window(main_window)

高级用法:处理特定窗口

有时需要根据窗口的标题或 URL 来切换到特定的窗口,可以遍历所有窗口句柄并检查每个窗口的属性:

for handle in driver.window_handles:
    driver.switch_to.window(handle)
    if "Bing" in driver.title:
        break

# 在特定窗口执行操作
driver.save_screenshot('specific_window.png')

窗口切换

在使用 Selenium 进行浏览器自动化时,窗口切换是一个常见且重要的操作。可以在多个窗口(或标签页)之间进行切换。

基本步骤

  1. 获取当前窗口的句柄:使用 driver.current_window_handle 获取当前窗口的句柄。
  2. 获取所有窗口的句柄:使用 driver.window_handles 获取所有打开的窗口句柄。
  3. 切换到指定窗口:使用 driver.switch_to.window(handle) 方法切换到指定的窗口。
  4. 执行操作后切换回原窗口:可以在其他窗口执行操作后,切换回原来的窗口。

示例代码

以下是一个示例代码,展示如何在多个窗口之间进行切换并执行操作:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 打开第一个网站
driver.get('http://www.google.com')

# 获取当前窗口句柄
main_window = driver.current_window_handle
print("Main window handle:", main_window)

# 打开一个新标签页
driver.execute_script("window.open('http://www.bing.com', '_blank');")

# 等待新标签页加载
time.sleep(3)

# 获取所有窗口句柄
handles = driver.window_handles
print("All window handles:", handles)

# 切换到新标签页
for handle in handles:
    if handle != main_window:
        driver.switch_to.window(handle)
        break

# 在新标签页中执行操作
search_box = driver.find_element(By.NAME, 'q')
search_box.send_keys('Selenium')
search_box.send_keys(u'\ue007')  # 模拟回车键

# 等待搜索结果加载
time.sleep(3)

# 截取新标签页的截图
driver.save_screenshot('bing_search_result.png')

# 切换回原窗口
driver.switch_to.window(main_window)

# 截取原窗口的截图
driver.save_screenshot('google_home.png')

# 关闭浏览器
driver.quit()

关闭指定窗口

可以使用 driver.close() 关闭当前窗口,而不是关闭所有窗口。

# 切换到新窗口并关闭它
driver.switch_to.window(handles[1])
driver.close()

# 切换回原窗口
driver.switch_to.window(main_window)

根据窗口属性切换

有时需要根据窗口的标题或 URL 切换到特定的窗口,可以遍历所有窗口句柄并检查每个窗口的属性:

for handle in driver.window_handles:
    driver.switch_to.window(handle)
    if "Bing" in driver.title:
        break

# 在特定窗口执行操作
driver.save_screenshot('specific_window.png')

使用 WebDriverWait 进行等待

在实际操作中,等待新窗口加载完成是很重要的。可以使用 WebDriverWait 进行显式等待:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待新窗口打开
new_window = WebDriverWait(driver, 10).until(
    EC.new_window_is_opened(handles)
)

# 获取所有窗口句柄
handles = driver.window_handles

# 切换到新窗口
driver.switch_to.window(handles[-1])

通过这些方法,你可以在 Selenium 中灵活地处理多个窗口或标签页的操作,确保自动化脚本能够正确地在不同窗口之间切换并执行相应的任务。

cookies操作

在 Selenium 中,可以使用浏览器的 cookies 来管理会话和用户数据。以下是有关如何添加、获取、删除和清除 cookies 的详细指南及示例代码:

常用操作

操作描述示例
add_cookie(cookie_dict) 添加一个 cookie driver.add_cookie({'name': 'key', 'value': 'value'})
get_cookie(name) 获取一个 cookie cookie = driver.get_cookie('key')
get_cookies() 获取所有 cookies cookies = driver.get_cookies()
delete_cookie(name) 删除一个 cookie driver.delete_cookie('key')
delete_all_cookies() 删除所有 cookies driver.delete_all_cookies()

示例代码

以下是一些操作 cookies 的示例代码:

from selenium import webdriver

driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 打开一个网站
driver.get('http://www.example.com')

# 添加一个 cookie
driver.add_cookie({'name': 'test_cookie', 'value': 'test_value'})

# 获取并打印所有 cookies
cookies = driver.get_cookies()
print("All cookies:", cookies)

# 获取并打印指定的 cookie
cookie = driver.get_cookie('test_cookie')
print("Specific cookie:", cookie)

# 删除指定的 cookie
driver.delete_cookie('test_cookie')

# 获取并打印所有 cookies
cookies = driver.get_cookies()
print("Cookies after deletion:", cookies)

# 删除所有 cookies
driver.delete_all_cookies()

# 获取并打印所有 cookies
cookies = driver.get_cookies()
print("Cookies after clearing:", cookies)

# 关闭浏览器
driver.quit()

高级操作示例

有时可能需要在浏览器启动之前设置 cookies。以下是一个示例,展示如何在浏览器启动之前加载 cookies:

from selenium import webdriver

# 设置启动选项
options = webdriver.ChromeOptions()

# 启动 Chrome
driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path, options=options)

# 打开一个网站以初始化会话
driver.get('http://www.example.com')

# 添加 cookies
cookies = [
    {'name': 'cookie1', 'value': 'value1'},
    {'name': 'cookie2', 'value': 'value2'}
]

for cookie in cookies:
    driver.add_cookie(cookie)

# 刷新页面以应用 cookies
driver.refresh()

# 获取并打印所有 cookies
all_cookies = driver.get_cookies()
print("Cookies after adding:", all_cookies)

# 关闭浏览器
driver.quit()

通过这些方法,可以灵活地管理 Selenium 中的 cookies,确保自动化脚本能够正确处理会话和用户数据。

执行js

在 Selenium 中,你可以使用 execute_script 方法来执行 JavaScript 代码。这个方法非常强大,可以用来执行任意的 JavaScript 代码,并与网页元素进行交互。以下是一些常见的使用场景和示例代码:

基本用法

execute_script(script, *args) 方法执行 JavaScript 代码,其中 script 是要执行的 JavaScript 代码,*args 是传递给脚本的参数。

示例代码

以下是一些常见的使用示例:

1. 执行简单的 JavaScript 代码

from selenium import webdriver

driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 打开一个网站
driver.get('http://www.example.com')

# 执行简单的 JavaScript 代码
driver.execute_script("alert('Hello, world!');")

# 等待用户关闭 alert 弹窗
driver.switch_to.alert.accept()

# 关闭浏览器
driver.quit()

2. 获取网页标题

title = driver.execute_script("return document.title;")
print("Page title is:", title)

3. 滚动页面

# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# 滚动到页面顶部
driver.execute_script("window.scrollTo(0, 0);")

4. 操作元素

# 查找元素并隐藏
element = driver.find_element(By.ID, 'element_id')
driver.execute_script("arguments[0].style.display = 'none';", element)

# 查找元素并修改其内容
element = driver.find_element(By.ID, 'element_id')
driver.execute_script("arguments[0].innerText = 'New text';", element)

5. 获取元素属性

element = driver.find_element(By.ID, 'element_id')
value = driver.execute_script("return arguments[0].getAttribute('value');", element)
print("Element value is:", value)

6. 传递参数给 JavaScript

result = driver.execute_script("return arguments[0] + arguments[1];", 10, 20)
print("Result is:", result)

综合示例

以下是一个综合示例,展示了如何使用 execute_script 方法来执行各种操作:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 打开一个网站
driver.get('http://www.example.com')

# 获取页面标题
title = driver.execute_script("return document.title;")
print("Page title is:", title)

# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)

# 滚动到页面顶部
driver.execute_script("window.scrollTo(0, 0);")
time.sleep(2)

# 修改元素内容
element = driver.find_element(By.ID, 'element_id')
driver.execute_script("arguments[0].innerText = 'New text';", element)

# 隐藏元素
driver.execute_script("arguments[0].style.display = 'none';", element)

# 显示一个 alert
driver.execute_script("alert('Script executed successfully!');")

# 等待用户关闭 alert 弹窗
driver.switch_to.alert.accept()

# 关闭浏览器
driver.quit()

页面等待

在使用 Selenium 进行浏览器自动化时,页面等待是一个重要的概念。它可以确保网页加载完成或特定元素出现后再继续执行操作,从而避免脚本运行错误或失败。Selenium 提供了三种主要的等待机制:隐式等待、显式等待和自定义等待。

隐式等待

隐式等待会设置一个全局的等待时间。在查找元素时,如果元素立即不可用,Selenium 会在指定的时间内不断地尝试查找,直到超时。

from selenium import webdriver

driver_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 设置隐式等待时间为10秒
driver.implicitly_wait(10)

driver.get('http://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_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

driver.get('http://www.example.com')

# 显式等待,等待指定元素出现,最长等待时间为10秒
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'element_id'))
)

# 继续进行后续操作
element.click()

# 关闭浏览器
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_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

driver.get('http://www.example.com')

# 自定义等待函数,等待页面加载完成
def wait_for_page_load(driver):
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script('return document.readyState') == 'complete'
    )

wait_for_page_load(driver)

# 查找元素
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_path = 'path/to/chromedriver'
driver = webdriver.Chrome(executable_path=driver_path)

# 设置隐式等待时间为10秒
driver.implicitly_wait(10)

driver.get('http://www.example.com')

# 显式等待,等待指定元素可见
element = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.ID, 'element_id'))
)

# 继续进行后续操作
element.click()

# 自定义等待,等待页面加载完成
def wait_for_page_load(driver):
    WebDriverWait(driver, 10).until(
        lambda d: d.execute_script('return document.readyState') == 'complete'
    )

wait_for_page_load(driver)

# 关闭浏览器
driver.quit()

通过这些等待机制,你可以确保在页面完全加载或元素可用之后再执行后续操作,从而提高自动化脚本的稳定性和可靠性。

配置对象

在 Selenium 中,可以通过配置浏览器选项对象来开启无界面模式和使用代理 IP。以下是详细的步骤和示例代码。

开启无界面模式

无界面模式(headless mode)允许你在没有图形界面的环境中运行浏览器。这在服务器环境中非常有用。

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

# 实例化配置对象
chrome_options = Options()

# 配置对象添加开启无界面模式的命令
chrome_options.add_argument("--headless")

# 配置对象添加禁用GPU命令
chrome_options.add_argument("--disable-gpu")

# 实例化带有配置对象的driver对象
driver = webdriver.Chrome(options=chrome_options)

# 打开一个网站
driver.get('http://www.example.com')

# 截取屏幕截图
driver.save_screenshot('example.png')

# 关闭浏览器
driver.quit()

使用代理 IP

使用代理 IP 可以帮助绕过 IP 限制,或者模拟来自不同地区的访问。

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

# 实例化配置对象
chrome_options = Options()

# 配置对象添加使用代理的命令
proxy = "http://proxy_server:port"
chrome_options.add_argument(f'--proxy-server={proxy}')

# 实例化带有配置对象的driver对象
driver = webdriver.Chrome(options=chrome_options)

# 打开一个网站
driver.get('http://www.example.com')

# 打印页面标题
print(driver.title)

# 关闭浏览器
driver.quit()

 

posted @ 2024-07-05 00:09  JJJhr  阅读(24)  评论(0编辑  收藏  举报