软件测试之Selenium的使用与常见面试题总结

自动化测试

让程序代替人去验证程序功能的过程

为什么要进行自动化测试

  • 减少回归测试成本
  • 解决压力测试
  • 减少兼容性测试成本
  • 提高测试效率,保证产品质量

什么Web项目适合做自动化测试

  • 需求变动不频繁
  • 项目周期长
  • 项目需要回归测试(编写一次脚本就可以多次运行)
  • 需要进行大数据量的数据驱动测试

主流的自动化测试工具

  • Web自动化测试
    • selenium:一个集成的库文件(可以在java或者python中import这个包,然后调用它提供的API),免费,主要做功能测试
    • robot framework
  • App端自动化测试
    • Appium
    • Monkeyrunner
    • UIautomation
  • PC客户端(win32)自动化测试
    • QTP:收费,支持web,桌面自动化测试
  • 接口自动化测试
    • Jemeter:Java平台开发的一款测试工具,支持Web,接口测试,性能测试
    • Postman / httpUnit / RESTClient(浏览器插件)
  • 云测平台
    • Testin Testbird
  • 性能测试
    • Jemeter
    • LoadRunner

Selenium

特点

  • 开源,功能强大,可以根据需要自己定制化功能
  • 跨平台
  • 支持多种语言
  • 支持对多个浏览器进行测试

Selenium IDE的使用(不重要)

Selenium IDE是一个Firefox插件,用于记录和播放用户与浏览器的交互。通过Selenium IDE,可以录制脚本,然后可以将这个脚本转换为代码语言
使用案例:

  • 需求:使用Selenium IDE插件录制-打开百度搜索引擎, 搜素(淘宝官网) 关键字, 在返回搜素果页面点击任意链接:比如:(淘宝网-淘!我喜欢)链接
  • 使用方法
    • 下载firefox火狐浏览器
    • 添加selenium IDE插件,网址:https://addons.mozilla.org/en-US/firefox/addon/selenium-ide/
      在这里插入图片描述
    • 打开selenium IDE
      在这里插入图片描述
  • 开启录制,输入百度网址,点击淘宝官网
    在这里插入图片描述
  • 保存脚本(ctrl + s)
    在这里插入图片描述
  • 导出为py程序
    在这里插入图片描述
  • 导出后的程序如下图所示:
    在这里插入图片描述
  • 注意:录制脚本时会录制鼠标和键盘在浏览器中的所有操作,有时候需要我们手动的填写,修改或者删除脚本(selenium IDE也实现了该功能)

如何快速查找一个元素标签的属性和值

有些时候我们需要自己手工编写脚本,比如以下语句,就是要在页面中找到IDkw的元素,并且将它的值设置为 淘宝官网 。但是往往一个页面元素特别的多,需要一个方法,快速的查找元素标签的属性和值。

self.driver.find_element(By.ID, "kw").send_keys("淘宝官网")

解决办法:使用自带的开发者工具即可。F12进入调试模式,点击调试工具最左边的按钮,此时,鼠标移到想定位的元素上,指定的代码行就会自动高亮。
在这里插入图片描述
补充:在seleniumIDE中的脚本中,点击一下按钮也可以定位元素。
在这里插入图片描述

Selenium使用

  • 安装selenium包:pip install selenium
  • 下载火狐浏览器
  • 下载驱动:
    • 火狐驱动下载链接为http://npm.taobao.org/mirrors/geckodriver
    • Chrome驱动下载链接:https://chromedriver.storage.googleapis.com/index.html?path=2.35/
  • 将驱动放在python或者Anaconda的安装目录中(前提是python已经加入环境变量中),
  • 使用示例
from selenium import webdriver      # 导包
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
if __name__ == '__main__':
    binary = FirefoxBinary('D:/Software/firefox/firefox.exe')   # firefox浏览器的可执行文件路径
    driver = webdriver.Firefox(firefox_binary=binary)       # 实例化火狐浏览器对象
    driver.get("https://www.baidu.com/")        # 打开指定网址
    driver.find_element_by_id("kw").send_keys("淘宝官网")       # 在页面中找到id为kw的元素,将元素的值设置为淘宝官网
    driver.quit()       # 退出

元素定位方式(八种)

  • id:通过元素的id属性来定位,必须唯一find_element_by_id(id值)
  • name:通过元素的name属性来定位,可以重名,但是只能找一个,find_element_by_name(name值)
  • class_name:通过元素的class属性来定位,find_element_by_class_name(class名称)
  • tag_name:通过元素的标签名称来定位,每个标签表示了一类元素,find_element_by_tag_name(标签名称),多个标签时返回符合条件的第一个标签
  • link_text:只定位超链接<a>标签,find_element_by_link_text(文本值),需要传入a标签的全部文本,定位元素后一般使用click()方法,相当于点击该链接
  • partial_link_text:link_text的扩展,模糊匹配,find_element_by_partial_link_text(文本值),需要传入a标签的能表达唯一性局部文本
  • Xpath( 路径):find_element_by_xpath(路径)
  • CSS(css选择器):find_element_by_css_selector()
  • find_elements_bt_XXX()查找定位所有符合条件的元素,返回值类型为列表
  • 补充知识
    • python路径写法:"D:\\Software\\test.txt",或者"D:/Software/test.txt"或者r"D:\Software\test.txt"

Xpath定位的使用(下面几种方法都可以结合起来使用)

  • 路径定位
    • 绝对路径:从最外层元素到指定元素之间所有经过元素层级路径,比如/html/body/form/div/fieldset/p[1](下标从0开始)
    • 相对路径:从第一个符合条件元素开始,比如//input
  • 利用路径+元素属性定位:比如://input[@id='userA'],在页面中查找所有有id属性的input标签,且id属性的值为userA
  • 利用路径+层级+属性结合定位:要找的元素没有属性,但是它的父级有,比如://p[@id='p1']/button
  • 利用路径+属性+逻辑结合定位:解决元素之间有多个属性重名的问题,比如://*[@id='telA' and @class='telAl]
  • 补充
    • 查找文本内容是xxx的元素,全部匹配,//*[text()='xxx']
    • 查找attribute属性中以xxx开头的元素,//*[starts-with(@attribute, 'xxx')]
    • 查找attribute属性中含有xxx的元素,//*[contains(@attribute, 'xxx')]

CSS定位的使用(速度比Xpath快)

  • id选择器,比如#userA,选择id属性值为userA的所有元素
  • class选择器,比如.telA,选择class属性值为telA的所有元素
  • 元素选择器,比如button,选择所有button元素
  • 属性选择器,比如[type="password"],选择所有type属性值为password的元素,id和class也可以作为属性进行选择。
  • 层级选择器,比如p>input或者p input,选择所有p元素下所有的input元素
  • 补充
    • input[type^='p'],选择所有input元素中,type属性以p字母开头的元素
    • input[type$='p'],选择所有input元素中,type属性以p字母结束的元素
    • input[type*='p'],选择所有input元素中,type属性包含p字母的元素

By类的使用

  • driver.find_element(By.CSS_SELECTOR, 'mail').send_keys(“123@qq.com")
  • driver.find_element(By.XPATH, '//*[@id="mailA"] ') .send_keys(123@qq.com')
  • driver.find_element(By.ID, "userA") .send_keys("admin")
  • driver.find_element(By.NAME, "passwordA") .send_keys(“123456")
  • driver.find_element(By.CLASS_NAME, "telA") .send_keys("123456")
  • driver.find_element(By.TAG_NAHE, 'input') .send_keys(“123")
  • driver.find_element(By.LINK_TEXT, '访问新浪网站') .click()
  • driver.find_element(By.PARTIAL_LINK_TEXT, '访问') .click()

常用方法

参考链接:https://blog.csdn.net/weixin_36279318/article/details/79475388

  • set_window_size() 设置浏览器的大小
  • back() 控制浏览器后退
  • forward() 控制浏览器前进
  • refresh() 刷新当前页面
  • clear() 清除文本
  • send_keys (value) 模拟按键输入
  • click() 单击元素
  • submit() 提交表单
  • get_attribute(name) 获取元素属性值
  • is_displayed() 设置该元素是否用户可见
  • size 返回元素的尺寸
  • text 获取元素的文本

鼠标事件

  • ActionChains(driver) 构造ActionChains对象
  • move_to_element(element) 在element指向的元素上执行鼠标悬停操作
  • double_click() 双击
  • drag_and_drop() 拖动
  • context_click() 用于模拟鼠标右键操作, 在调用时需要指定元素定位
  • perform() 执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作
    比如:
element= driver.find_element_by_link_text("设置")
ActionChains(driver).move_to_element(element).perform()

键盘事件

  • send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
  • send_keys(Keys.SPACE) 空格键(Space)
  • send_keys(Keys.TAB) 制表键(Tab)
  • send_keys(Keys.ESCAPE) 回退键(Esc)
  • send_keys(Keys.ENTER) 回车键(Enter)
  • send_keys(Keys.CONTROL,'a') 全选(Ctrl+A),其他类似

获取断言

  • driver.title 用于获得当前页面的标题
  • driver.current_url 用户获得当前页面的URL
  • text 获取搜索条目的文本信息,比如:user = driver.find_element_by_class_name('nums').text

多表单切换

  • driver.switch_to.frame() 将当前定位的主体切换为frame/iframe表单的内嵌页面中
  • driver.switch_to.default_content(id属性名/name属性名) 跳回最外层的页面
  • driver.switch_to.parent_frame() 如果iframe没有可用的id和name属性,则可以先定位孩子,再使用parent定位

多窗口切换

  • current_window_handle 获得当前窗口句柄
  • window_handles 返回所有打开的窗口的句柄
  • switch_to.window(窗口句柄) 切换到相应的窗口

警告框处理

  • text 返回 alert/confirm/prompt 中的文字信息
  • accept() 接受现有警告框
  • dismiss() 解散现有警告框
  • send_keys(keysToSend) 发送文本至警告框

下拉框选择操作

  • from selenium.webdriver.support.select import Select
  • Select(sel).select_by_value(“选择值”) select标签的value属性的值,sel为下拉框对应的元素
  • Select(sel).select_by_index(“索引值”) 下拉框的索引
  • Select(sel).select_by_visible_testx(“文本值”) 下拉框的文本值

文件上传

  • driver.find_element_by_name("file").send_keys('D:\\upload_file.txt') 通过send_keys()指定本地文件路径的方式实现文件上传

cookie操作

  • get_cookies() 获得所有cookie信息
  • get_cookie(name) 返回字典的key为“name”的cookie信息
  • add_cookie(cookie_dict) 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值
  • delete_cookie(name,optionsString) 删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”
  • delete_all_cookies() 删除所有cookie信息

调用JavaScript代码

  • driver.execute_script(js代码)

窗口截图

  • driver.get_screenshot_as_file(图片保存位置) 对当前窗口截图保存

关闭浏览器

  • close() 关闭单个窗口
  • quit() 关闭所有窗口

面试题总结

参考链接:https://blog.csdn.net/yoyocat915/article/details/81838455

自动化测试可以达到100%覆盖率吗?

比较难,自动化测试追求的是高ROI而不是高覆盖率

  • 有些用例场景无法被自动化
  • 一些验证易用性友好性的用例不适合做自动化
  • 有些边缘的用例很少被重复执行,没必要去编写脚本做自动化
    ROI = (手工测试的成本 - 自动化测试成本)/ 自动化测试成本

你是怎样编写元素的xpath表达式的?

一般是自己写Xpath表达式, 再利用Try Xpath小工具判断编写的Xpath表达式是不是正确的(chrome中使用F12,然后使用Ctrl+F输入也可以)。也可以在谷歌和火狐中按F12后,对选中的元素使用右键中的Copy Xpath功能。
在这里插入图片描述

Selenium中常见的异常有哪些?

  • NoSuchElementException:找不到页面元素异常
  • ElementNotInteractableException:元素展现出来了但是不可操作异常
  • StaleElementReferenceException:元素与页面的关联关系失效,一般出现在页面刷新或者执行回退后
  • NoSuchFrameException:在切换iframe时找不到指定的iframe
  • TimeOut Exception:超时异常

selenium中如何判断元素是否存在?

  • 方法一:使用find_elements(注意有个s),然后判断返回列表的长度
ele=driver.find_elements_by_css_selector(element)
if len(ele)==0:
	print("不存在")
  • 方法二:捕获异常
try:
	driver.find_element_by_css_selector(css)
except:
	print("不存在")

selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?

  • 加上显示等待或者隐式等待(主要适用于网速不好时)
  • 在使用前判断元素是否是可点击的:element.is_enabled()
  • 在使用前判断元素是否是可见的:element.is_displayed(),有些时候需要使用滚动条操作使得元素可见
  • 确定被点击的元素有没有被其他元素遮挡
    补充:
    隐性等待方法为:driver.implicitly_wait(time),time是最长等待时间,只有在页面完全加载完成才执行下一步,且隐性等待对整个driver的周期都起作用,只要设置一次就行了。主要针对整个页面。
    显示等待:主要针对某个元素,在规定时间内,可见、可点击、等等,超出时间则抛出异常
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,10).until(EC.title_is(u"百度一下,你就知道"))  # 判断页面的title是否为“百度一下,你就知道”,如果不是,就等待指定的时间

Selenium如何定位动态元素?

采用模糊定位(动态元素的id或者class等元素属性是动态生成的,但是一般都满足某种条件)

driver.find_element_by_xpath ("//div[contains(@id, 'auto-id')]") 
driver.find_element_by_xpath ("//div[starts-with(@id, 'auto-id')]") 
driver.find_element_by_xpath ("//div[ends-with(@id, 'auto-id)]") # 这个需要结尾是‘auto-id’

父子、兄弟、相邻节点的定位方式

参考链接:https://blog.csdn.net/huilan_same/article/details/52541680

  • 由父节点定位子节点
  • 由子节点定位父节点:在Xpath路径中使用..,比如:driver.find_element_by_xpath("//div[@id='C']/../..")
  • 由弟弟节点定位哥哥节点:先获取该节点的父节点,再获得哥哥节点,或者使用Xpath中的preceding-sibling,比如:"//div[@id='D']/preceding-sibling::div[1]"等价于"//div[@id='D']/../div[1]"
  • 由哥哥节点定位弟弟节点:先获取该节点的父节点,再获得弟弟节点,或者使用Xpath中的following-sibling

如何处理“不受信任的证书”的问题?

火狐:

// 创建firefoxprofile
FirefoxProfile profile=new FirefoxProfile();
// 点击继续浏览不安全的网站
profile.setAcceptUntrustedCertificates(true);
// 使用带条件的profile去创建一个driver对象
WebDriver driver=new FirefoxDriver(profile);

Chrome:

// 创建类DesiredCapabilities的对象
DesiredCapabilities cap=DesiredCapabilities.chrome();
// 设置ACCEPT_SSL_CERTS 变量值为true
cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
// 新建一个带capability的chromedriver对象
WebDriver driver=new ChromeDriver(cap);
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值