导图社区 Selenium思维导图
这是一篇关于Selenium思维导图,Selenium是一个用于Web应用程序测试的工具,此脑图包含第一个自动化脚本、unittest测试框架等。希望对你有所帮助!
编辑于2023-11-03 10:47:21Selenium
1. 第一个自动化脚本
from selenium import webdriver from time import sleep browser = webdriver.Chrome( ) browser.get('http://127.0.0.1/upload/forum.php') sleep(5) browser.quit()
#隐式等待 browser.implicitly_wait(5)
2. WebDriver API
定位
定位元素
1. id定位
HTML规定id属性在HTML文档中必须是唯一的
browser.find_element_by_id('ls_password').send_keys('123456')
2. name定位
browser.find_element_by_name('username').send_keys('admin')
3. class定位
browser.find_element_by_class_name('pn').click( )
4. tag name定位
browser.find_element_by_tag_name('input').send_keys('123456')
5. link定位
专门用来定位文本链接
browser.find_element_by_link_text('默认版块').click( )
6. partial link定位
partial link定位是对link元素的一种补充,有时候文本链接比较长,我们可以取文本链接的一部分定位
browser.find_element_by_partial_link_text('默认').click( )
7. xpath定位
//表示相对路径
[@id=‘ls_username’]表示元素的id等于‘ls_username’
browser.find_element_by_xpath('//input[@name="password"]').send_keys('123456')
browser.find_element_by_xpath('//button[@class="pn vm"]').click( )
属性结合层级定位
text 获取元素的文本 <开始标签>文字(文本)</结束标签>
a = browser.find_element_by_xpath('//button[@class="pn vm"]/em').text print(a)
browser.find_element_by_xpath("//div/a[@class='xi2 xw1']").click( )
模糊定位
text( )函数
browser.find_element_by_xpath('//a[text()="退出"]').click( )
contains( )函数
browser.find_element_by_xpath('//a[contains(@href,"logout")]').click()
starts-with()函数
browser.find_element_by_xpath('//a[starts-with(@href,"member.php?mod=l")]').click( )
8. CSS Selector定位
id用#
browser.find_element_by_css_selector('#ls_password').send_keys('123456')
browser.find_element_by_css_selector('#ls_username').send_keys('admin')
class用 "."
browser.find_element_by_css_selector('.pn.vm').click( )
9. XPath与CSS对比
定位一组元素
定位一组元素,返回一个列表
控制
控制浏览器
1. 控制浏览器窗口大小
set_window_size( )
driver.set_window_size(480,800)
browser.set_window_size(480,600)
2. 最大化浏览器
maximize_window( )
driver.maximize_window( )
browser.maximize_window()
3. 控制浏览器的前进
back( )
driver.back( )
browser.back()
forword( )
driver.forward( )
browser.forward()
4. 模拟浏览器刷新
refresh( )
driver.refresh( )
browser.refresh()
简单元素操作
from selenium import webdriver from time import sleep browser = webdriver.Chrome( ) browser.get('http://127.0.0.1/upload/forum.php') sleep(2) #定位用户名输入框 username=browser.find_element_by_id('ls_username') username.send_keys('admin') sleep(1) #清空文本 username.clear( ) #获取其他属性 print('name',username.get_attribute('name')) print('class',username.get_attribute('class')) print('tabindex',username.get_attribute('tabindex')) #is_displayed() 返回元素的结果是否可见,如果可见返回True,否则返回False #登录旁的立即注册 True print(browser.find_element_by_xpath("//td/a[@class='xi2 xw1']").is_displayed( )) #快捷导航下的立即注册,False print(browser.find_element_by_xpath("//div/a[@class='xi2 xw1']").is_displayed( )) sleep(5) browser.quit( )
下拉列表操作
from selenium.webdriver.support.select import Select #下拉列表的操作封装在Select类里面 #生成一个Select对象,参数为要选择的下拉列表 #自动导入,光标放在Select类上面,然后按下Alt+Enter,选择Select类导入 s = Select(browser.find_element_by_id('education'))
调用方法
根据索引来选择
s.select_by_index(2) #选择博士
根据值来选择,HTML中value属性的值
s.select_by_value("2") #选择大学
根据可见的文本来选择,能看见的下来列表的项
s.select_by_visible_text("博士")
鼠标操作
WebDriver中关于鼠标操作的方法封装在ActionChains类中
执行动作
perform( )
右击
context_click( )
双击
double_click( )
悬停
move_to_element( )
拖动
drag_and_drop(source,target)
键盘操作
WebDriver中通过Keys( )类来操作键盘的所有按键 通过send_keys( )方法可以模拟输入键盘上的按键
删除键(BackSpace)
send_keys(Keys.BACK_SPACE)
空格键(Space)
send_keys(Keys.SPACE)
回车键(Enter)
send_keys(Keys.ENTER)
制表键(Tab)
send_keys(Keys.TAB)
全选 (Ctrl+A)
send_keys(Keys.CONTROL,‘a’)
复制 (Ctrl+C)
send_keys(Keys.CONTROL,‘c’)
粘贴 (Ctrl+V)
send_keys(Keys.CONTROL,‘v’)
框架切换
Web应用中经常会遇到frame/iframe框架嵌套页面的应用
WebDriver提供了switch_to.frame方法将当前定位的主体切换到frame/iframe框架内嵌页面中
switch_to.default_content( )方法跳出当前的框架
窗口切换
WebDriver提供了switch_to.window( )方法实现不同窗口之间的切换
current_window_handle:获取当前窗口句柄
window_handles:返回所有窗口的句柄,存在在列表中
弹出框操作
切换到弹出框
switch_to.alert
确定按钮
accept( )
取消按钮
dismiss( )
执行JS
WebDriver没有提供浏览器滚动条的操作方法,在这种情况下,可以借助JavaScript来控制滚动条
WebDriver提供了execute_script( )方法来执行JS代码
window.scrollTo(x,y) 是JavaScript中用于设置浏览器滚动条的水平和垂直位置,第一个参数表示水平的左间距,第一个参数表示垂直的上边距
3. unittest测试框架
作用
自动化用例的组织和管理
自动化用例执行
测试结果统计和测试报告生成
unittest是Python的单元测试框架,它不仅适用于单元测试,也适用WEB自动化测试用例的开发与执行
unittest可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果
TestCase
一个TestCase的实例就是一个测试用例。包括测试前准备环境的搭建(setUp),执行 测试代码(run),以及测试后环境的还原(tearDown)。一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证
TestSuite
多个测试用例集合在一起,就是TestSuite
TestRunner
用来执行测试用例的,通过TestRunner类提供的run( )方法来执行test suite/test case
TestLoader
加载测试用例
4. 练习
立即注册
from selenium import webdriver from time import sleep import random import time browser = webdriver.Chrome( ) browser.get('http://127.0.0.1/upload/forum.php') # i = random.randint(1,1000000000) i = time.time( ) username = 'test'+str(int(i)) print(username) #定位立即注册 browser.find_element_by_link_text('立即注册').click( ) #输入用户名 browser.find_element_by_id('Zp0luO').send_keys(username) #输入密码 browser.find_element_by_id('g033gz').send_keys('123456') #确认密码 browser.find_element_by_id('w9kNs1').send_keys('123456') #email browser.find_element_by_id('7uxU99').send_keys(username+'@qq.com') sleep(5) #点击提交 browser.find_element_by_id('registerformsubmit').click( ) sleep(5) browser.quit( )
test_login.py
import unittest from selenium import webdriver from time import sleep class LoginTestCase(unittest.TestCase): #相当于预置条件,在用例之前执行 def setUp(self): #self 属性 全局变量 self.browser = webdriver.Chrome() self.browser.maximize_window() self.browser.implicitly_wait(5) self.browser.get('http://127.0.0.1/upload/forum.php') #相当于run,使用admin登录,相当于1个测试用例 def test_login_admin(self): #赋值简化 browser = self.browser browser.find_element_by_id('ls_username').send_keys('admin') browser.find_element_by_id('ls_password').send_keys('123456') browser.find_element_by_css_selector('button.pn.vm').click() sleep(3) #获取用户名 username = browser.find_element_by_css_selector('a[title="访问我的空间"]').text self.assertEqual('admin', username) #使用test1登录,第二个测试用例 def test_login_test1(self): # 赋值简化 browser = self.browser browser.find_element_by_id('ls_username').send_keys('test1') browser.find_element_by_id('ls_password').send_keys('123456') browser.find_element_by_css_selector('button.pn.vm').click() sleep(3) # 获取用户名 username = browser.find_element_by_css_selector('a[title="访问我的空间"]').text self.assertEqual('test1', username) #用例执行完之后的清理动作 def tearDown(self): sleep(3) self.browser.quit() if __name__ == '__main__': unittest.main()
test_post.py
import unittest from selenium import webdriver from time import sleep,time from selenium.webdriver import ActionChains class PostTestCase(unittest.TestCase): def setUp(self): self.browser = webdriver.Chrome() self.browser.maximize_window() self.browser.implicitly_wait(5) self.browser.get('http://127.0.0.1/upload/forum.php') #测试用例一定要以test开头 #快速发帖 def test_post1(self): #登录 browser = self.browser browser.find_element_by_id('ls_username').send_keys('admin') browser.find_element_by_id('ls_password').send_keys('123456') browser.find_element_by_css_selector('button.pn.vm').click() #暂停 sleep(1) # 点击默认版块 browser.find_element_by_link_text('默认版块').click() # 输入标题 title = 'test' + str(int(time())) browser.find_element_by_id('subject').send_keys(title) # 输入内容 browser.find_element_by_id('fastpostmessage').send_keys(title) # 点击发表 browser.find_element_by_id('fastpostsubmit').click() #获取帖子标题 subject = browser.find_element_by_id('thread_subject').text self.assertEqual(subject,title) #点击发帖按钮后发帖 def test_post2(self): # 登录 browser = self.browser browser.find_element_by_id('ls_username').send_keys('admin') browser.find_element_by_id('ls_password').send_keys('123456') browser.find_element_by_css_selector('button.pn.vm').click() # 暂停 sleep(1) # 点击默认版块 browser.find_element_by_link_text('默认版块').click() # 鼠标移动到发帖按钮 post_button = browser.find_element_by_id('newspecial') post_link = browser.find_element_by_css_selector('ul#newspecial_menu>li>a') ActionChains(browser).move_to_element(post_button).click(post_link).perform() # 输入标题 title = 'test' + str(int(time())) browser.find_element_by_id('subject').send_keys(title) # 切换框架 browser.switch_to.frame('e_iframe') # 输入内容 browser.find_element_by_tag_name('body').send_keys(title) # 跳出框架 browser.switch_to.default_content() # 点击发表帖子 browser.find_element_by_id('postsubmit').click() #获取标题 # 获取帖子标题 subject = browser.find_element_by_id('thread_subject').text self.assertEqual(subject, title) def tearDown(self): self.browser.quit()