selenium实现UI自动化
Selenium是一个用于自动化Web浏览器操作的开源工具,广泛用于测试Web应用程序、执行自动化任务和进行Web数据抓取。以下是Selenium的一些基础知识:
-
Selenium组件:
- Selenium WebDriver:用于模拟用户与Web页面的交互,支持多种浏览器,如Chrome、Firefox、Edge、Safari等。
- Selenium IDE:一个浏览器插件,用于录制和回放用户的交互操作,以生成测试用例。
- Selenium Grid:用于在不同计算机和浏览器上并行运行测试的工具。
-
支持的编程语言:
- Selenium支持多种编程语言,包括Java、Python、C#、JavaScript等。您可以选择最熟悉的语言来编写自动化脚本。
-
安装Selenium WebDriver:
- 要使用Selenium WebDriver,您需要安装浏览器驱动程序(如ChromeDriver、GeckoDriver等)以及相应的编程语言库。
- 例如,如果您使用Python,可以通过pip安装selenium库,并下载适用于您的浏览器的驱动程序。
-
创建WebDriver实例:
- 使用WebDriver库创建浏览器驱动程序的实例,例如Chrome、Firefox等。
- 示例(使用Python):
from selenium import webdriver driver = webdriver.Chrome() # 创建Chrome浏览器实例
-
导航和操作网页:
- 使用WebDriver实例导航到Web页面,执行各种操作,如点击链接、填写表单、模拟键盘输入等。
- 示例:
driver.get("https://www.example.com") # 导航到网页 element = driver.find_element_by_id("element_id") # 查找元素 element.click() # 点击元素
-
等待元素加载:
- 使用显式或隐式等待来等待页面元素加载,以确保脚本不会在元素尚未可用时失败。
- 示例:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "element_id")) )
-
执行JavaScript:
- Selenium允许执行JavaScript代码,以处理页面上的特殊情况或执行自定义操作。
- 示例:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滚动页面
-
断言和验证:
- 使用断言和验证来验证页面上的元素和行为,以确保应用程序的正确性。
- 示例:
assert "Example" in driver.title # 验证页面标题包含"Example"
-
关闭和退出浏览器:
- 在测试完成后,关闭浏览器窗口或退出驱动程序以释放资源。
- 示例:
driver.close() # 关闭当前窗口 driver.quit() # 退出浏览器
Selenium提供了强大的工具和方法,使您能够模拟用户与Web应用程序的交互,执行自动化测试,执行Web数据抓取和执行各种Web自动化任务。学习Selenium的基础知识后,您可以进一步探索其高级功能和方法,以满足特定的需求。
安装
- selenium虽然称之为工具,但是实际是python中的一个库
pip install selenium==3.14
元素定位方法
Selenium提供多种元素定位方法,用于在Web页面上查找和与页面元素进行交互。以下是一些常用的元素定位方法:
-
通过ID定位元素:
- 使用
find_element_by_id
方法,通过元素的ID属性来查找元素。
element = driver.find_element_by_id("element_id")
- 使用
-
通过名称定位元素:
- 使用
find_element_by_name
方法,通过元素的name属性来查找元素。
element = driver.find_element_by_name("element_name")
- 使用
-
通过XPath定位元素:
- 使用
find_element_by_xpath
方法,通过XPath表达式来查找元素。
element = driver.find_element_by_xpath("//input[@name='username']")
- 使用
-
通过CSS选择器定位元素:
- 使用
find_element_by_css_selector
方法,通过CSS选择器来查找元素。
element = driver.find_element_by_css_selector("input[name='password']")
- 使用
-
通过链接文本定位元素:
- 使用
find_element_by_link_text
方法,通过链接的文本内容来查找元素。
element = driver.find_element_by_link_text("Click Here")
- 使用
-
通过部分链接文本定位元素:
- 使用
find_element_by_partial_link_text
方法,通过链接的部分文本内容来查找元素。
element = driver.find_element_by_partial_link_text("Learn More")
- 使用
-
通过标签名定位元素:
- 使用
find_element_by_tag_name
方法,通过元素的标签名来查找元素。
element = driver.find_element_by_tag_name("input")
- 使用
-
通过类名定位元素:
- 使用
find_element_by_class_name
方法,通过元素的类名来查找元素。
element = driver.find_element_by_class_name("form-control")
- 使用
这些是Selenium中常用的元素定位方法。您可以根据Web页面的结构和元素属性选择合适的方法来查找和操作元素。通常,XPath和CSS选择器是最灵活和强大的方法,但您可以根据需要选择其他方法。要查找多个匹配的元素,可以使用find_elements_*
方法,例如find_elements_by_xpath
。
示例中的driver
代表Selenium WebDriver的实例,您需要创建一个WebDriver对象并使用它来执行元素查找和操作操作。
webdriver的常用方法
Selenium WebDriver提供了多种常用方法,用于与Web页面元素进行交互、导航和执行各种操作。以下是一些常用的WebDriver方法:
- 导航方法:
get(url)
: 导航到指定的URL。back()
: 后退到上一个页面。forward()
: 前进到下一个页面。refresh()
: 刷新当前页面。
- 元素定位方法:
find_element(by, value)
: 查找单个元素,参数by
指定查找方式(如By.ID
、By.NAME
),value
指定查找值。find_elements(by, value)
: 查找多个元素,返回元素列表。
- 元素交互方法:
element.click()
: 单击元素。element.send_keys(keys)
: 向元素发送键盘输入。element.clear()
: 清除元素的文本内容。
- 获取元素属性和文本:
element.text
: 获取元素的可见文本内容。element.get_attribute(attribute)
: 获取元素指定属性的值,如href
、value
等。
- 等待方法:
WebDriverWait(driver, timeout).until(expected_conditions)
: 显式等待,等待元素满足特定条件。time.sleep(seconds)
: 强制等待指定时间,不管条件是否满足,需要import time模块
- 窗口和框架操作:
driver.switch_to.window(window_name)
: 切换到指定窗口。driver.switch_to.frame(frame_reference)
: 切换到指定框架。
- 执行JavaScript:
execute_script(script, *args)
: 在当前页面执行JavaScript代码。execute_async_script(script, *args)
: 异步执行JavaScript代码。
- 管理浏览器窗口:
driver.maximize_window()
: 最大化浏览器窗口。driver.set_window_size(width, height)
: 设置浏览器窗口大小。
- 截图和保存页面:
driver.save_screenshot(filename)
: 截取屏幕截图并保存到指定文件。driver.page_source
: 获取当前页面的HTML源代码。
这些是Selenium WebDriver中的一些常用方法。您可以根据需要使用这些方法来实现各种自动化测试和任务。通常,元素定位、交互和等待是自动化测试中最常见的操作。
鼠标操作
Selenium可以模拟鼠标操作来与网页上的元素互动。下面是一些常见的Selenium鼠标操作:
-
单击元素:
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("my_element_id") ActionChains(driver).click(element).perform()
-
双击元素:
ActionChains(driver).double_click(element).perform()
-
右击元素:
ActionChains(driver).context_click(element).perform()
-
将鼠标移动到元素上:
ActionChains(driver).move_to_element(element).perform()
-
拖拽元素到指定位置:
target_element = driver.find_element_by_id("target_element_id") ActionChains(driver).drag_and_drop(element, target_element).perform()
-
在元素上执行鼠标悬停操作(鼠标悬停在元素上触发悬停效果):
ActionChains(driver).move_to_element(element).perform()
-
鼠标滚轮滚动:
# 负值表示向下滚动,正值表示向上滚动 ActionChains(driver).move_to_element(element).perform() ActionChains(driver).send_keys(Keys.ARROW_DOWN).perform()
-
鼠标按下和释放操作(模拟按住鼠标左键然后释放):
ActionChains(driver).click_and_hold(element).perform() ActionChains(driver).release(element).perform()
这些鼠标操作可以用于模拟用户与Web页面进行互动,执行测试脚本或执行自动化任务。注意,要使用这些鼠标操作,需要导入ActionChains
类并创建ActionChains
对象,然后使用perform()
方法执行操作。确保安装了Selenium和适当的浏览器驱动程序以便进行鼠标操作。
键盘事件
Selenium可以模拟键盘事件,允许你与网页上的文本输入框和其他元素进行互动。下面是一些常见的Selenium键盘事件操作:
-
向文本输入框发送文本:
from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("my_input_id") element.send_keys("Hello, World!")
-
清除文本输入框中的文本:
element.clear()
-
模拟键盘回车(Enter)操作:
element.send_keys(Keys.RETURN)
-
模拟键盘删除(Backspace)操作:
element.send_keys(Keys.BACKSPACE)
-
模拟键盘Tab操作:
element.send_keys(Keys.TAB)
-
模拟键盘组合操作,如Ctrl+A(全选)、Ctrl+C(复制)和Ctrl+V(粘贴):
from selenium.webdriver.common.keys import Keys element.send_keys(Keys.CONTROL, 'a') # 全选 element.send_keys(Keys.CONTROL, 'c') # 复制 element.send_keys(Keys.CONTROL, 'v') # 粘贴
-
模拟键盘上、下、左、右箭头操作:
element.send_keys(Keys.ARROW_UP) element.send_keys(Keys.ARROW_DOWN) element.send_keys(Keys.ARROW_LEFT) element.send_keys(Keys.ARROW_RIGHT)
-
模拟键盘空格操作:
element.send_keys(Keys.SPACE)
这些键盘事件可以用于与文本输入框、下拉菜单、模拟键盘快捷键等元素进行互动。请注意,键盘事件需要使用send_keys
方法,并可以与Keys
类中定义的常量一起使用。确保安装了Selenium和适当的浏览器驱动程序以便执行键盘事件。
断言
在Selenium中进行断言是一种验证网页元素状态和内容是否符合预期的常见操作。通常,你可以使用断言来确认页面上的某个元素是否存在、文本是否与期望的文本匹配等。以下是如何在Selenium中进行断言的一些示例:
-
确认元素存在:
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException driver = webdriver.Chrome() driver.get("https://example.com") try: element = driver.find_element_by_id("my_element_id") assert element is not None, "元素不存在" except NoSuchElementException: assert False, "元素不存在"
-
确认元素文本匹配:
element = driver.find_element_by_id("my_element_id") expected_text = "期望的文本" assert element.text == expected_text, f"文本不匹配,期望的是'{expected_text}',实际是'{element.text}'"
-
确认页面标题:
expected_title = "期望的页面标题" assert driver.title == expected_title, f"页面标题不匹配,期望的是'{expected_title}',实际是'{driver.title}'"
-
确认页面URL:
expected_url = "https://example.com" assert driver.current_url == expected_url, f"页面URL不匹配,期望的是'{expected_url}',实际是'{driver.current_url}'"
-
使用断言库:
你还可以使用Python中的断言库(例如assert
关键字或unittest
库中的assert
方法)来执行断言操作。这样可以更简单地编写和管理断言语句。
请注意,断言是用来验证代码逻辑和网页元素是否如预期的重要工具,但在编写自动化测试脚本时,确保提供有意义的错误消息以便于调试和维护。如果断言失败,会抛出AssertionError
异常,你可以捕获异常并在失败时采取适当的措施。
切换窗口
在Selenium中,要处理多个浏览器窗口或选项卡,你可以使用window_handles
属性来获取所有窗口句柄,并使用switch_to.window()
方法来切换窗口。下面是一个示例,演示如何在Selenium中切换窗口:
from selenium import webdriver
# 创建一个浏览器实例
driver = webdriver.Chrome()
# 打开第一个网页
driver.get("https://www.example.com")
# 打开一个新窗口
driver.execute_script("window.open('', '_blank');")
# 获取所有窗口句柄
window_handles = driver.window_handles
# 切换到新打开的窗口
driver.switch_to.window(window_handles[1])
# 在新窗口中打开另一个网页
driver.get("https://www.google.com")
# 在新窗口中执行其他操作,例如查找元素、输入文本等
# 切换回第一个窗口
driver.switch_to.window(window_handles[0])
# 在第一个窗口中执行其他操作
# 关闭浏览器
driver.quit()
上面的示例首先打开一个网页,然后使用execute_script
方法打开一个新窗口。然后,通过window_handles
属性获取所有窗口句柄,通过switch_to.window()
方法切换到新窗口。你可以在不同的窗口中执行各种操作,然后使用switch_to.window()
切换回原始窗口。最后,使用quit()
方法关闭浏览器。
请注意,window_handles
返回的窗口句柄列表的顺序是按打开顺序排列的,因此第一个句柄通常是最初的窗口,第二个句柄是新打开的窗口,依此类推。你可以根据需要进行窗口切换,以执行你的自动化测试任务。
表单切换
在Selenium中,要切换到表单(iframe)中以操作表单元素,可以使用switch_to.frame()
方法。这个方法允许你在页面上有多个嵌套的iframe时在不同的表单之间进行切换。以下是一些示例代码来说明如何切换到表单和切回主文档:
-
切换到表单:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 通过索引切换到第一个表单(从0开始) driver.switch_to.frame(0) # 在表单中操作表单元素 element = driver.find_element_by_id("my_input") element.send_keys("在表单中输入的文本") # 切回主文档 driver.switch_to.default_content()
-
通过名称或ID切换到表单:
# 通过名称切换到表单 driver.switch_to.frame("frame_name") # 通过ID切换到表单 driver.switch_to.frame("frame_id")
-
切回主文档:
使用
switch_to.default_content()
方法可以切回主文档,以便后续在主文档中操作元素。 -
嵌套表单的切换:
如果页面中有多层嵌套的表单,你可以使用多次的
switch_to.frame()
来切换到嵌套的表单,然后再切回上层表单或主文档。
请注意,使用switch_to.frame()
方法切换到表单后,所有的查找元素和操作将在该表单上执行。确保你在切换回主文档之前完成在表单中的操作。此外,一些表单可能没有名称或ID,因此你可能需要查找表单的父元素或其他方式来定位表单元素。
通过上述方法,你可以在Selenium中切换和操作表单元素,以执行表单相关的自动化测试任务。
弹窗处理
在Selenium中,要处理弹窗(浏览器弹出窗口、对话框等)通常使用switch_to.window()
方法。弹窗可能是新窗口、对话框或浏览器的不同窗口选项卡。以下是如何切换和处理弹窗的示例:
-
切换到新窗口或选项卡:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 打开一个新窗口,例如通过点击链接或按钮触发 driver.execute_script("window.open('', '_blank');") # 获取所有窗口句柄 window_handles = driver.window_handles # 切换到新窗口 driver.switch_to.window(window_handles[1]) # 在新窗口中执行操作,如打开另一个网页 driver.get("https://www.google.com") # 切换回原始窗口 driver.switch_to.window(window_handles[0]) # 关闭浏览器 driver.quit()
-
处理对话框:
如果弹窗是JavaScript的警告、确认或提示框,你可以使用
switch_to.alert
来处理它们。alert = driver.switch_to.alert # 获取对话框文本 alert_text = alert.text # 确认对话框(点击“确定”按钮) alert.accept() # 取消对话框(点击“取消”按钮) alert.dismiss()
这些示例演示了如何在Selenium中处理不同类型的弹窗。你可以根据需要切换和操作弹窗,以执行自动化测试任务。在测试中,弹窗处理通常是很常见的操作,因为它们可以包括警告、确认和其他与用户交互相关的信息。
下拉选择框的处理
在Selenium中,处理下拉选择框(也称为下拉菜单、下拉列表)是一个常见的任务,因为它们用于选择选项或值。下面是处理下拉选择框的一些方法:
-
通过标签文本选择选项:
from selenium import webdriver from selenium.webdriver.support.ui import Select driver = webdriver.Chrome() driver.get("https://example.com") # 定位下拉选择框元素 dropdown = Select(driver.find_element_by_id("my_dropdown_id")) # 通过选项文本选择 dropdown.select_by_visible_text("选项文本")
-
通过选项值选择:
# 通过选项值选择 dropdown.select_by_value("option_value")
-
通过选项索引选择:
# 通过选项索引选择(从0开始) dropdown.select_by_index(2) # 选择第3个选项
-
获取当前选中的选项:
# 获取当前选中的选项 selected_option = dropdown.first_selected_option
-
获取所有选项:
# 获取所有选项 all_options = dropdown.options
-
取消选择选项:
# 取消选择选项 dropdown.deselect_by_visible_text("选项文本")
-
取消选择所有选项:
# 取消选择所有选项 dropdown.deselect_all()
请注意,要使用上述方法处理下拉选择框,必须首先找到下拉选择框的HTML元素,然后使用Select
类包装该元素,使其成为可操作的下拉选择框对象。
处理下拉选择框是自动化测试中的常见任务,因为它们通常用于选择不同的选项以执行不同的操作。通过使用上述方法,你可以在Selenium中轻松处理下拉选择框。
上传文件
在Selenium中,要实现文件上传,你需要与<input type="file">
元素交互,这是一个允许用户选择文件的输入框。以下是如何在Selenium中进行文件上传的示例:
from selenium import webdriver
# 创建一个浏览器实例
driver = webdriver.Chrome()
driver.get("https://example.com")
# 定位文件上传元素
upload_element = driver.find_element_by_id("file_upload_id")
# 使用send_keys方法发送文件路径
upload_element.send_keys("C:/path/to/your/file.txt")
# 等待上传完成,这取决于页面和文件大小
# 这可以是一个固定的等待时间或等待特定元素加载等
# 你可以使用WebDriverWait来等待元素状态或可见性等
这段代码做了以下几件事情:
-
定位到具有文件上传功能的
<input>
元素。你可以使用不同的定位方法(如find_element_by_id
、find_element_by_name
、find_element_by_xpath
等)来找到这个元素。 -
使用
send_keys()
方法将文件的本地路径传递给该输入框。这会模拟用户选择文件的操作。确保提供正确的文件路径。文件路径应该是绝对路径,包括文件名。 -
如果需要,可以使用显式等待来等待上传完成。这是可选的,具体等待时间可能因页面和文件大小而异。
请注意,文件上传的实际操作可能因网站的实现方式而异,有些网站可能需要模拟点击“上传”按钮,而其他网站则会在文件选择后自动触发上传。你需要根据网站的具体实现方式进行相应的操作。
以上示例中使用的是Chrome浏览器,不同浏览器的行为可能会有所不同,但基本原理是相同的。你可以根据你的测试环境和需求来使用不同的浏览器驱动程序。