selenium是一个基于浏览器的自动化测试框架,提供了跨平台、跨浏览器的端到端的web自动化解决方案。
主要包括三部分:Selenium IDE,Selenium WebDriver,Selenium Grid
firefox的一个扩展,可以进行录制、回放,并把录制的操作以多种语言(例如java,python等)的形式导出成测试用例
提供Web自动化所需要的API,主要用于浏览器控制,页面元素选择和调试。不同的浏览器需要不同的WebDriver
提供了在不同机器上的不同浏览器上运行selenium测试的能力
pip install selenium
这里下载的是firefox
浏览器的驱动,放在/usr/local/bin
目录下面
以下代码会在浏览器中执行:
打开浏览器并进入blog网站
设置浏览器窗口大小,宽为800,高为400
等待3s
刷新页面
最大化窗口
退出浏览器
# Generated by Selenium IDE
import time
from selenium import webdriver
from time import sleep
class TestFirsttest:
def setup_method(self, method):
self.driver = webdriver.Firefox()
self.vars = {}
def teardown_method(self, method):
self.driver.quit()
def wait_for_window(self, timeout=2):
time.sleep(round(timeout / 1000))
wh_now = self.driver.window_handles
wh_then = self.vars["window_handles"]
if len(wh_now) > len(wh_then):
return set(wh_now).difference(set(wh_then)).pop()
def test_firsttest(self):
#进入blog网站
self.driver.get("https://some2501.me/blog/author/ali/")
#缩放浏览器窗口大小,宽为800,高为400
self.driver.set_window_size(800, 400)
#等待3秒
sleep(3)
# 刷新页面
self.driver.refresh()
# 等待3秒
sleep(3)
# 最大化窗口
self.driver.maximize_window()
# 退出浏览器
self.driver.quit()
XPath是用来定位xml文档节点的语言
通过f12打开浏览器开发者工具,定位到元素的位置之后,在查看器
的相应html代码处右键
选择复制-XPath
就能得到该元素的xpath路径
driver.find_element(By.XPATH,"/html/body/div[2]/div[3]/a[1]/h3")
拿到对应元素的ID
driver.find_element(By.ID,"input_button")
如果没有元素匹配,会抛出NoSuchElementException
异常
通过name定位
拿到对应元素的name
driver.find_element(By.NAME,"nameField")
在name定位里,会返回第一个name属性匹配的元素,如果没有元素匹配,会抛出NoSuchElementException
异常
通过class定位
知道class就使用这个定位,只返回匹配的第一个,无元素匹配,会抛出NoSuchElementException
异常
拿到对应元素的类名,这里是name
driver.find_element(By.CLASS_NAME,"name")
通过tag定位
返回匹配的第一个元素,无元素匹配,抛出NoSuchElementException
异常
拿到对应元素的标签名,这里是p
driver.find_element(By.TAG_NAME,"p")
通过link定位
如果知道一个锚标签使用了什么文本,可以使用这种方法。会返回第一个文本属性匹配的链接,如果没有元素匹配,会抛出NoSuchElementException
异常
例如<a href="./home">HOME</a>
,那对应的link text就是HOME
driver.find_element(By.LINK_TEXT,"HOME")
通过css选择器定位
只返回匹配的第一个,无元素匹配,会抛出NoSuchElementException
异常
拿到对应元素的css选择器代码,这里是.top_nav > a:nth-child(2)
driver.find_element(By.CSS_SELECTOR,".top_nav > a:nth-child(2)")
通过partialLink定位
与link text的定位方式很类似,只不过link text是精确匹配,partialLink是模糊匹配。例如,有个登录按钮,通过模糊匹配登
也可以匹配到这个登录按钮
driver.find_element(By.PARTIAL_LINK_TEXT,"登录")
进行了元素定位之后,就可以进行元素的交互,常见的交互有:
点击: click()
发送键位
只针对内容可编辑的元素和文本字段
例如,有一个输入框,可以给他设置值:
send_keys("ali")
清除:clear()
也是只针对内容可编辑的元素和文本字段
可以获得元素当前的一些信息
is_selected()
适用于单选框、复选框、输入元素和select元素等,判断元素是否被选中,是则返回True,后者返回False
tag_name
获得元素的标签名称
rect
获得元素的尺寸和坐标
value_of_css_property("具体的属性名")
获得元素的某个CSS属性的值
例如:value_of_css_property('color')
text
获得元素文本
针对选择列表元素,selenium提供了比较便捷的方法获取其中的元素
在selenium的support包中有一个select
类,可以将它导入:
from selenium.webdriver.support.select import Select
例如有一个select列表如下:
<select id="test_select">
<option value=value1>Bread</option>
<option value=value2 selected>Milk</option>
<option value=value3>Cheese</option>
</select>
获取这个select列表
select_element = driver.find_element(By.ID,'test_select')
select_object=Select(select_element)
选择元素
有3种方法可以从上述元素中选择第一个选项(option)
select_object.select_by_index(1)
select_object.select_by_value("value1")
select_object.select_by_visible_text(Bread")
获取所有被选中的options
all_selected_options = select_object.all_selected_options
获取第一个被选中的option
first_selected_option = select_object.first_selected_option
获取select列表中包含的所有options
all_available_options = select_object.options
取消任意option的选中状态,也是有3种方式,以取消第1个为例
select_object.deselect_by_index(1) # 取消第一个option的选中状态
select_object.deselect_by_value('value1')
select_object.deselect_by_visible_text('Bread')
取消所有option的选中状态
select_object.deselect_all()
设置select列表是否可以多选
does_this_allow_multiple_selections = select_object.is_multiple