一、Selenium的执行原理?
1. 启动浏览器和WebDriver:
from selenium import webdriver
# 启动Chrome浏览器
driver = webdriver.Chrome()
# 打开网页
driver.get("https://www.example.com")
2.WebDriver与浏览器通信:
WebDriver是Selenium的核心组件,它通过与浏览器建立通信通道来控制浏览器行为。
3. 发送指令至浏览器:
# 寻找页面元素
element = driver.find_element(By.ID, "example_id")
# 模拟用户操作,如输入文本、点击按钮等
element.send_keys("example_text")
# 或者执行JavaScript脚本
driver.execute_script("document.title='New Title'")
4. 获取页面信息:
# 获取页面的URL
current_url = driver.current_url
# 获取页面的标题
page_title = driver.title
# 获取页面的HTML源代码
page_source = driver.page_source
5. 等待机制的应用:
Selenium提供了多种等待方式,包括显式等待、隐式等待等,用于确保页面加载完成或元素可见。
6. 用户自动化脚本的执行:
# 定位元素
element = driver.find_element(By.ID, "example_id")
# 执行用户操作,比如点击按钮
element.click()
7. 浏览器执行自动化脚本:
WebDriver通过与浏览器的通信,实际执行用户编写的自动化脚本,模拟用户在浏览器中的各种行为。
8. 测试结果反馈:
测试框架(如JUnit、TestNG)或其他方式可以用于收集和报告测试结果。
9. 结束测试:
- 测试完成后,关闭浏览器和WebDriver实例。
二,Selenium常见的七种定位方式
from selenium.webdriver.common.by import By
# 1. 通过ID定位
element_by_id = driver.find_element(By.ID, "your_element_id")
# 2. 通过名称定位
element_by_name = driver.find_element(By.NAME, "your_element_name")
# 3. 通过类名定位
element_by_class_name = driver.find_element(By.CLASS_NAME, "your_class_name")
# 4. 通过标签名定位
element_by_tag_name = driver.find_element(By.TAG_NAME, "b")
# 5. 通过XPath定位
element_by_xpath = driver.find_element(By.XPATH, "//your/xpath/expression")
# 6. 通过CSS选择器定位
element_by_css_selector = driver.find_element(By.CSS_SELECTOR, "your_css_selector")
# 7. 通过链接文本定位(用于链接)
element_by_link_text = driver.find_element(By.LINK_TEXT, "your_link_text")
三,Selenium无法定位的情况(1、普通情况)
1.元素加载延迟
- 解决方法:使用'WebDriverWait'结合等待条件,确保元素在也买你上加载完毕后在进行定位
from selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECelement = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "your_element_id")))
2.动态生成的ID或类名
- 解决方法:使用包含部分ID或类名的定位方式,或者使用基于其他元素的定位方式
# 部分ID或类名element1 = driver.find_element(By.ID, "partial_id")# 使用其他元素关系定位element2 = driver.find_element(By.XPATH, "//div[@class='parent']/div[@class='child']")
3. JavaScript异步加载的元素
- 解决方式:使用'WebDriverWait'结合条件等待。等待元素的特定条件(如出现。。。可点击)
element = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "your_element_id")))
4.元素定位方式错误
- 解决方法:检查使用的定位方式是否正确,例如,确认使用
By.ID
而不是By.I
。 # 正确的写法element = driver.find_element(By.ID, "your_element_id")# 错误的写法element = driver.find_element(By.I, "your_element_id")
5.页面没有最大化,导致没法定位。
- 解决方法:
# 最大化浏览器窗口driver.maximize_window()
四, Selenium无法定位的情况(2.页面三剑客:)
1.弹框操作:
- 弹框通常包括警告框、确认框和提示框。在Selenium中,你可以使用
switch_to.alert
来处理这些弹框。
alert = driver.switch_to.alert
alert.dismiss() # 取消弹框
# 或者
alert.accept() # 接受弹框
2.框架页操作:
- 在处理嵌套框架(iframe)时,你可以使用
switch_to.frame
进入框架,然后使用switch_to.default_content()
返回主文档。
driver.switch_to.frame("frame_id_or_name")
# 在框架内执行操作
driver.switch_to.default_content() # 返回主文档
3.窗口切换操作:
- 当一个页面中有多个窗口时,你可以使用
window_handles
获取窗口句柄列表,并使用switch_to.window
切换到特定窗口。
window_handles = driver.window_handles
driver.switch_to.window(window_handles[1]) # 切换到第二个窗口
五,Selenium处理其他特殊操作
1、处理下拉框
- Selenium提供select来处理
from selenium.webdriver.support.ui import Select
# 定位下拉框元素
select_element = driver.find_element(By.ID, "dropdown_id")
# 使用Select类创建Select对象
select = Select(select_element)
# 通过可见文本选择选项
select.select_by_visible_text("Option 1")
# 通过索引选择选项(从0开始)
select.select_by_index(1)
# 通过值选择选项
select.select_by_value("option_value")
2.处理多选下拉框:
如果下拉框允许多选,可以使用
select_by_*
系列方法多次选择不同的选项。
from selenium.webdriver.support.ui import Select
# 定位多选下拉框元素
multi_select_element = driver.find_element(By.ID, "multi_dropdown_id")
# 使用Select类创建Select对象
multi_select = Select(multi_select_element)
# 通过可见文本选择选项
multi_select.select_by_visible_text("Option 1")
multi_select.select_by_visible_text("Option 2")
3.处理文件上传:
通过
send_keys()
方法给文件上传输入框发送文件路径来实现文件上传。
file_input = driver.find_element(By.ID, "file_input_id")
file_input.send_keys("path/to/your/file.txt")
4.处理复选框(Checkbox)和单选框(Radio button):
# 处理复选框
checkbox = driver.find_element(By.ID, "checkbox_id")
checkbox.click()
# 处理单选框
radio_button = driver.find_element(By.ID, "radio_id")
radio_button.click()
5. 处理悬浮提示(Tooltip):
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element(By.ID, "element_id")
# 悬停鼠标
ActionChains(driver).move_to_element(element).perform()
六,高级事件处理
1. 模拟键盘按键组合:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 打开网页
driver.get("https://example.com")
# 模拟键盘按键组合:Ctrl + A(全选)
search_box = driver.find_element("id", "search-box")
search_box.send_keys(Keys.CONTROL + "a")
2.鼠标悬停点击:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
# 打开网页
driver.get("https://example.com")
# 鼠标悬停在一个元素上
element_to_hover_over = driver.find_element("id", "hover-element")
hover = ActionChains(driver).move_to_element(element_to_hover_over)
hover.perform()
# 鼠标点击
element_to_click = driver.find_element("id", "click-element")
ActionChains(driver).click(element_to_click).perform()
3.拖拽和释放:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
# 打开网页
driver.get("https://example.com")
# 找到源元素和目标元素
source_element = driver.find_element("id", "source-element")
target_element = driver.find_element("id", "target-element")
# 拖拽和释放
actions = ActionChains(driver)
actions.drag_and_drop(source_element, target_element).perform()
4.按键组合和操作复杂场景
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
# 打开网页
driver.get("https://example.com")
# 模拟键盘按键组合:Ctrl + Shift + N(在新窗口中打开新标签页)
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL).key_down(Keys.SHIFT).send_keys("n").key_up(Keys.SHIFT).key_up(Keys.CONTROL).perform()
七,三种等待方式
1. 显式等待(Explicit Wait):
- 显式等待是在代码中明确规定等待条件,直到满足条件或超时为止。它使用
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
# 创建 WebDriverWait 实例,等待最多10秒
wait = WebDriverWait(driver, 10)
# 显式等待元素可见
element = wait.until(EC.visibility_of_element_located((By.ID, "example_id")))
# 执行其他操作
element.click()
2.隐式等待(Implicit Wait)
- 隐式等待是在全局范围内设置等待时间,对整个
WebDriver
对象的生命周期都有效。它在查找元素时等待一定的时间,如果找到元素,就立即执行。
from selenium import webdriver
# 设置隐式等待时间为10秒
driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 打开网页
driver.get("https://example.com")
# 在整个页面寻找元素,如果找到就立即执行
element = driver.find_element(By.ID, "example_id")
element.click()
3. 强制等待(Sleep):
强制等待是通过
time.sleep()
函数在代码中设置一个固定的等待时间。这种方式不太灵活,因为它不会根据实际情况进行调整。
import time
# 强制等待5秒
time.sleep(5)
# 继续执行其他操作
版权归原作者 六便士_forever 所有, 如有侵权,请联系我们删除。