Selenium项目源于Jason Higgins的日常工作, Paul Gross和Jie Tina Wang在2004年为ThoughtWorks工作过. 同时向他们的同事展示Selenium, 保罗·哈曼特看到了巨大的潜力, 并建议将Selenium开源,并使其以驱动模式工作,从而使其他编程语言可以访问它. 因为它从一开始就是开源的, 许多人的贡献使它成为今天强大的web自动化工具.
硒IDE也发挥了很大的作用,使 Selenium project 和它一样流行和广泛. 由Shinya Kasatani创建的Firefox插件, 该工具使用户能够记录浏览器操作,然后在浏览器中以一组Selenium核心命令的形式播放. 然后,他们可以将这些操作保存到一个文件中,并在以后作为一个自包含的脚本重用它们.
硒:不仅仅是安全网
版本1被证明是一个有趣的框架, 这让很多人对自动化测试过程有了更多的认识. 版本2在此基础上构建,将WebDriver作为接口引入,并即将成为 W3C standard . Selenium的WebDriver架构也被用作移动应用测试框架的起点,例如 Appium , Selendroid and iosdriver .
Selenium Library
Selenium使web应用程序和站点的自动化成为一个简化的过程. 它使用在HTML4/HTML5/CSS标准中找到带有选择器的网页元素的方法. That way, 使用一些聪明的脚本可以减轻手动测试web应用程序的负担. Selenium WebDriver接口可以使用任何现代浏览器,并使用HTML/CSS选择器自动化网站和应用程序,这些选择器以类似于实际用户使用浏览器的方式进行交互-只是快一点.
硒实际上由三个独立的成分组成:
Selenium WebDriver (Selenium 2)
Selenium IDE
硒遥控器
Selenium WebDriver知识是所需的关键技能, 使用Selenium驱动程序编写测试是我们正在寻找的. 硒遥控器是Selenium Server的一部分, 允许Selenium浏览器测试在专用服务器网格上并行运行的组件, 并且只是构建自动化系统的附加组件.
虽然Selenium IDE非常适合新用户,并且可以快速尝试Selenium或被测系统的实际工作方式, 它不能被认为是一种可以完全完成工作的工具, 因为对于一个有很多功能的大项目来说,需要以逻辑和可读的方式组织大量的测试. 要创建Selenium自动测试, coding skills, architectural skills, 技术知识也是必需的, 任何开发过程都是如此.
Questions and Answers
Selenium被设计成一个易于使用的框架, 这样技术经验较少的人就可以使用它来满足日常需求. 任何人都可以使用Selenium IDE编写脚本,甚至不需要离开浏览器. 但实际上,在可以使用它的人之间不仅仅只有一条细微的界限, 一个擅长于此的人, 以及精通Selenium开发和测试过程的人. 在大多数情况下,Selenium开发人员需要的不仅仅是编码人员和数据驱动人员. 在接下来的章节中,我们将看到在选择完美的候选人时可以评估哪些技能.
自动化还是不自动化
尽管关于自动化覆盖范围的争论仍在继续, 没有人能否认Selenium作为web自动化事实上的标准的身份,以及它对测试世界的巨大影响. 一些组织已经为自动化而疯狂, 并且不雇用没有自动化和开发背景的人. QA Developers, 测试自动化工程师, 软件工程师测试(SET)或其他组织的称呼, 如今,将各种工具(包括Selenium)授权到被测系统的上下文中是非常需要的, 只要开发周期如此之快,这种趋势就会持续下去, 随着网络软件变得越来越复杂.
还会出现另一个问题:是否需要一个全职的专门的Selenium开发人员? 有人可能会说,编写应用程序及其特性代码的开发人员也可以使用Selenium创建自动化测试. 在很多情况下,这可能是真的.
这个问题没有直接的答案, 因为这取决于很多不同的因素,比如项目规模, solution complexity, manpower, and deadlines. 如果一个web开发人员需要花一半的工作时间来自动化和编码测试, 这并不是真正的高效. 有经验的专门的Selenium开发人员将花费更少的时间进行自动化, 从一开始就知道如何以最好的方式组织代码, 还将创建一个测试的质量层. 他们还可以提供见解和技巧,使这些功能更加用户友好和高效. 覆盖在没有自动化的情况下不容易测试的边缘情况和情况,可以帮助为最终产品创建另一层安全性. 这取决于你对产品的最终质量有多坚定,并从第一天起就让它发挥应有的作用.
问:自动化一个项目及其所有特性是否总是合适的?
然而,不可否认的是,自动化在日常开发中是非常有用的, 有些情况下自动化是不合适的, or even possible. 同时,考虑到 test pyramid , 有太多的自动化UI测试并依赖于它们是不明智的, 由于所有主要的应用程序特性都必须在单元之外的级别上进行覆盖, services). 因此,只有关键的应用程序特性才需要使用UI覆盖率进行测试. 一些次要的应用程序功能可以在无人参与的情况下通过主要应用程序工作流进行测试,并对这些组件使用特定的单元测试.
QA,开发者或两者兼而有之?
问:作为开发者或QA,你是如何看待自己的?
你要找的既不是严格意义上的QA也不是开发人员. 在一个不断发展的世界里, 您正在寻找一个拥有适合敏捷开发理念的广泛技能的人. 对于Selenium开发人员来说尤其如此, 也许比你团队中的其他角色更重要. 他们当然不是传统的QA, and most of the time, 他们没有产生任何值得通过公司大门发布的代码. 他们所做的是提供支持代码,这对于减少测试时间和费用至关重要, 并给予产品远远超出常规测试工作的支持.
尽管如此,他们还是需要具备QA技能. 创建有效且有意义的测试场景, testing edge cases, 然后将它们编码为脚本应该是他们日常工作的一部分. Selenium开发人员需要理解复杂的业务逻辑和规则, 因为这是使自动化工作真正有价值的要求之一.
Selenium开发人员不应该担心手工测试会弄脏自己的手, 因为让我们面对现实吧, 你可以自动化很多, 但你不必把一切都自动化. 在自动化测试效率不高以及人类判断提供的信息比计算机所能提供的更多的情况下,手动测试仍然是非常有效的. 计算机在执行方面很好,但在判断方面不行. 所以让人类做他们最擅长的事. 自动化从手工测试结束的地方开始. 使用Selenium WebDriver的自动化始终是手工工作的继承者, 因为它进一步验证了在手动测试应用程序时做出的正确判断.
Language-gnostic
问:在编写Selenium测试时,您更喜欢使用哪种语言?
Selenium WebDriver被移植到许多流行的语言中, 所以如果你正在寻找一个硒专家, 你不必太担心他使用的语言. 当然,除非它对实际业务或公司政策至关重要. 驱动程序库可用于Java(本机),c#, Python, Ruby和JavaScript. 对于经验丰富的Selenium开发人员来说,切换到任何一种不同的语言应该是非常容易的. 驱动程序库的api几乎是相同的, 将重点放在语言的最佳编码实践上.
让我们看看这些差异在实践中是如何表现的:
Java:
import org.junit.AfterClass;
import static org.junit.Assert.*;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
公共类TestToptal {
私有静态FirefoxDriver驱动;
@Before
初始化edriver (){
driver = new FirefoxDriver();
}
@Test
公共无效testTitle(){
driver.get("http://skuznk.sportshsc.com");
assertEquals(driver.getTitle(),“雇佣前3%的自由开发者、设计师和其他技术人才.");
}
@After
关闭浏览器(){
driver.quit();
}
}
Ruby:
需要“selenium-webdriver”
需要的小型试验/自动运行
class TestToptal < Minitest::Unit::TestCase
def setup
@driver = Selenium::WebDriver.for :firefox
end
def test_title
@driver.get 'http://skuznk.sportshsc.com'
assert_equal @driver.标题:“雇佣自由职业者中最优秀的3%的开发者、设计师和其他技术人才."
end
def teardown
@driver.quit
end
end
Python:
import unittest
从selenium导入webdriver
类ToptalTest (unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.driver = webdriver.Firefox()
def test_title(自我):
self.driver.get("http://skuznk.sportshsc.com")
self.assertEqual(
self.driver.title,
“雇佣最优秀的3%的自由开发者、设计师和其他技术人才.")
@classmethod
def tearDownClass (cls):
cls.driver.quit()
正如你自己所见, 差别很小, 并期望实际需要编写的代码量.
HTML + CSS
事实上,一个人可以使用Selenium WebDriver自动化web页面或应用程序测试,而不需要任何HTML或CSS技能. Selenium可以提供选择器和操作规范,这些都可以直接使用. 但是,如果候选人具备HTML和CSS的知识和理解,则有很大的优势.
问:你如何评价你的HTML & CSS knowledge?
即使是中级HTML和CSS知识,对于处理被测web应用程序或站点的Selenium开发人员来说也是有益的. 特别是当它的加价比较重或比较复杂的时候.
了解这两种技术的另一个好处是,它允许Selenium开发人员以更直接的方式帮助前端开发人员, 或者甚至通过代码审查. 从许多组织的经验来看, 让项目成员参与到彼此的代码中被证明对整个开发过程是有益的.
Q: What is CSS? 如何在测试自动化环境中使用它?
CSS或层叠样式表是一种向终端客户端描述HTML表示的声明性语言. 使用CSS,普通HTML页面被呈现为样式优美的文档.
虽然它们对于实际的测试自动化可能不是那么重要, Selenium开发人员对CSS的了解可以帮助他们选择更好的选择器. 如果需要,它们还可以为高级断言使用CSS属性. 它们可以帮助识别写得不好的CSS,以便前端开发人员可以修复它们.
问:请简单描述一下HTML4的页面布局.
每个网页至少包含一个标题和一个正文标签,这些标签被包装在HTML根元素中. 而head保存一些特定于页面的元数据, 所有与实际用户界面相关的内容都在body标签中, 并且对最终用户可见.
Selenium开发人员将在body标签中度过他们的编程生涯, 找出定位元素和执行各种操作和断言的最佳方法.
问:从测试自动化的角度来看,如果一个页面使用HTML5,会有什么不同吗?
No. HTML5使用一组特定的标签,以获得更加标准化和注释良好的页面布局, 但是这对实际的测试自动化过程几乎没有影响. 虽然,这也取决于实际被测试的web应用程序.
Q: What is HTML DOM?
Domain Object Model, or in short DOM, 是HTML页面的编程接口吗, 并且在每次加载页面时构造. 它是一个树,将页面的元素表示为具有自己属性的对象, 操作方法和它们所响应的事件. 通过使用HTML对象模型,可以使用JavaScript对页面及其元素进行操作.
高级Web浏览器知识
Selenium开发人员不仅要知道如何编写代码,这一点非常重要, 但也知道浏览器的功能. Firefox, Chrome, IE (Edge), Safari等., 它们在页面加载方面都有细微的差别, 元素呈现和处理页面的内部机制. 一个人必须了解他们所有的怪癖,才能使这些工具屈从于他们的需要. Selenium开发人员不需要完全达到开发人员的知识水平, 但是他们需要比普通用户更了解浏览器. 这包括使用浏览器提供的工具, 例如开发者控制台, Network Traffic, 性能工具等等.
For example, Chrome有配置文件, 哪些可以为开发人员带来优势, 作为在每次运行之前设置测试集的一种方式, 比如在网站上加载图片, 使用不同的目录进行下载, 关闭高级或标准浏览器功能. Firefox也是如此,它的武器库中有一组类似的隐藏和不那么隐藏的选项. 掌握这些将使开发人员作为自动化工程师的生活更加轻松, 并且对于在各种场景中测试应用程序非常重要.
今天的浏览器就像迷你操作系统(有些人甚至倾向于这样看待它们),提供了很多功能, 大多数普通电脑用户都将它们视为软件中最重要的部分, 甚至不知道他们不是不可或缺的一部分. 掌握它们,就能过上更快乐的自动化生活.
JavaScript是患难中的朋友
如果候选人懂JavaScript,这也是一个很大的优势. 在某些情况下,JavaScript可能是自动化部分应用程序工作流的唯一方法. 在95%的情况下,这是不需要的. 但它仍然可以是一个区分因素,特别是如果项目是JavaScript繁重的. 因为可以在Selenium WebDriver的上下文中运行或触发JavaScript, 使其成为自动化解决方案的一部分是一个直截了当的过程.
许多现代项目几乎只使用JavaScript进行后端(服务器端)和前端(客户端)开发, 掌握这些知识可以让Selenium开发人员与其他开发人员保持同步.
Selenium开发人员还可以帮助检查JavaScript代码,帮助修复bug或在bug出现之前找到它们. 这对你的团队及其成功来说是无价的.
问:如何使用Selenium Driver调用JavaScript对象或方法?
可以使用Java中的JavascriptExecutor类在驱动程序的上下文中直接调用JavaScript, 在其他语言中也是如此. 脚本可以同步或异步执行:
// ...
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.firefox.FirefoxDriver;
// ...
WebDriver driver = new FirefoxDriver();
JavascriptExecutor js;
if (driver instanceof JavascriptExecutor) {
js = (JavascriptExecutor)driver;
}
js.executeScript(“返回文档.getElementById (myid);”);
// ...
This way, 您可以访问整个HTML DOM,也可以调用已经是页面一部分的任何脚本或对象.
通用编程知识
Selenium IDE使Selenium对于任何想要快速进入web自动化的初学者来说都非常简单. 而是为了制作高效可靠的脚本, 将代码组织成可重用的单元要好得多. 虽然可以使用Selenium IDE来记录和回放操作, 通过敏捷开发来维护代码是相当麻烦的, 很多特性都是快速而频繁地改变的. 所以,如果你正在寻找一个专家,你正在寻找的人谁也是一个优秀的开发人员.
问:你应该如何组织自动化代码?
如果使用Page Object模式组织Selenium测试代码,这也是一个很大的优势, 这将在几段之后讨论. 与支持代码解耦的测试代码可以进一步提高可维护性. 这里有一些指导方针:
让自定义支持库远离实际的测试代码
创建可在测试之间重用的工作流助手方法
使用页面对象来组织代码
删除旧的不相关代码
在添加新功能的同时删除已经覆盖的测试
由于自动化测试的变化非常快,因此建议随着开发的进行而快速更改它.
封装测试的测试库
组织测试代码的很大一部分实际上涉及到使用测试单元/规范/特性库,这些库将使测试断言和检查成为工作流的一部分. 没有它们也可以执行实际的测试脚本, 但它们确实提供了额外的控制水平, 特别是当项目使用CI(持续集成)服务器作为开发过程的一部分时.
问:你对测试库有什么经验?
测试库的选择将根据实际使用的编程语言而有所不同. 但是它们有一个共同点:断言Selenium执行的操作产生了预期的结果, 它是一个正在显示的web元素, 正在呈现的文本或浏览器界面上可能发生的其他任何事情. 按语言划分的一些最流行的库是:
Java: jUnit, TestNG
Ruby: rspec, minitest
Python: py.test, unittest, nose
问:你有编写Cucumber功能的经验吗?
Cucumber是一个处理特性的有趣库, 测试以类似于业务规范的方式指定,即使没有技术知识的人也可以阅读和理解:
场景:下载业务报表
鉴于我被任命为经理
当我搜索“最新报告”时
然后报告列表应该包含“从最后一天的报告”
This way, 测试变得更具交流性, 而编程实现则被排除在业务需求之外. 如果您有许多想要参与测试的涉众,那么这是一项再强调不过的技能, 以及那些没有实际的技术技能来自己解释代码的人.
Page Object Pattern
问:你使用过页面对象吗? How are they useful?
在Java Selenium库版本2中引入, 页面对象模式是将代码组织到可重用类中的好方法. 考虑下面的部分代码,这是自动化total网站应用程序的代码:
driver.findElement(By.CssSelector(“div [data-role = ' custom_field '] ")).click();
driver.findElement(By.CssSelector(“div[数据值=“开发人员”]”)).click();
driver.findElement(By.Id("talent_email")).sendKeys("selenium.dev@sportshsc.com");
driver.findElement(By.Id (" talent_password ")).sendKeys(“我的密码”);
driver.findElement(By.Id (" talent_password_confirmation ")).sendKeys(“我的密码”);
driver.findElement(By.Id (" talent_full_name ")).sendKeys(“硒Dev”);
driver.findElement(By.Id("talent_skype")).sendKeys("selenium.dev");
driver.findElement(By.Id (" save_new_talent ")).click();
It does the work, 但是,如果工作流因任何原因发生变化,它不太可能被重用或容易扩展. 使用页面对象模式, 这个简单的测试变成了一个高度可重用的类,可以在多个测试中初始化和使用:
package com.sportshsc.common.pageobjects;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
公共类signupage {
私有最终WebDriver驱动;
private By talentDiv = By.CssSelector(“div [data-role = ' custom_field ']”);
private By developerDiv = By.CssSelector(“div[数据值=“开发人员”]”);
private By designerDiv = By.CssSelector(“div[数据值= '设计']”);
private By emailField = By.Id("talent_email");
private By passwordField = By.Id(“talent_password”);
private By passwordConfirmField = By.Id(“talent_password_confirmation”);
private By fullNameField = By.Id(“talent_full_name”);
private By skypeNameField = By.Id("talent_skype");
private By saveTalentButton = By.Id(“save_new_talent”);
公共signupage (WebDriver驱动){
this.driver = driver;
if (!verifyBasePageTitle) {
抛出新的IllegalStateException("这不是注册页面");
}
}
getPageTitle() {
字符串title = driver.getTitle();
return title;
}
公共布尔verifyBasePageTitle() {
字符串expectedPageTitle="顶级开发者和设计师的独家访问| Toptal";
返回getPageTitle ().包含(expectedPageTitle);
}
public signupage selectTalent(String talent) {
driver.findElement (talentDiv).click();
if talent.equals (developerValue.text) {
driver.findElement (developerDiv).click();
} else if talent.equals(designerDiv.text) {
driver.findElement (designerDiv).click();
} else {
driver.findElement(By.CssSelector(String.格式(" div[数据值= ' % s ']”,人才)).click();
}
return this;
}
applyAsDeveloper(字符串电子邮件, String password, String fullName, String skypeName) {
driver.selectTalent(“开发人员”);
driver.findElement (emailField).sendKeys(email);
driver.findElement (passwordField).sendKeys(password);
driver.findElement (passwordConfirmField).sendKeys(password);
driver.findElement (fullNameField).sendKeys(fullName);
driver.findElement (skypeNameField).sendKeys(skypeName);
driver.findElement (saveTalentButton).click();
返回新的SignUpStepTwo(driver);
}
}
直接想到的是,当用户使用页面对象时,页面对象作为浏览器中实际发生的事情的精确对应物是最有意义的, 就像一个驱使页面追求目标的思想.
不同的语言有不同的Page Object库, 但它们都有一些共同点:它们都在对页面上的所有元素进行逻辑放置, 并且还提供了方便的方法来访问该页面上出现的任何功能. 它们也可以用作路由器, 其中页面对象是在web应用程序的动作和链接在一个逻辑结构,是相同的系统在测试后创建的. 然后,您可以将它们与等待状态结合起来,以创建一个复杂的机制,该机制将驱动您的测试,并包含对执行重要的所有逻辑.
尽管现在有很多网站和web应用程序使用单页原则来呈现内容, 在大多数情况下,页面对象仍然是有效的,至少以逻辑和干净的方式组织web元素.
问:页面对象应该是真实页面的精确副本(所有元素作为单独的对象)?
No. 因为通常每个页面上都有很多元素, 只有那些创建工作流自动化所必需的元素应该在Page Object中建模. 把每个元素都放在页面上实际上是适得其反的,因为它使页面对象变大了, clumsy, 很难维护,几乎无法使用.
问:是否建议直接在页面对象中做断言?
It should be avoided. Page Objects做得最好的是通过一个干净的API保持和公开页面结构和页面的内部逻辑. 可以让Page Object验证元素的某些状态,但它不应该直接断言.
Selenium Specifics
问:哪些元素选择器被认为是最优的?
创建用于测试某些功能的Selenium驱动程序脚本非常容易. 以后更改和支持脚本代码变得更加困难, 要么使用过于依赖页面结构的复杂选择器, 或者在开发测试脚本时不遵循页面对象模式. 最好的选择是那些最有特色的, and at the same time, 随着应用程序的增长和布局的变化,最容易遵循.
For example:
driver.findElement(By.CssSelectors("div.some-section div.my-section > a#some-id"))
当你只能做简单的选择时:
driver.findElement(By.Id("some-id"))
这也引出了另一个问题:对于页面元素的定位器来说,什么样的选择器才是最好的? 而务实的人会说,任何有效的东西都足够好, 这里有一个最好遵循的等级制度:
id > name > class >= css_selector > tag > text > xpath
这也是有争议的, 但总结一下背后的逻辑, id是每个页面最独特的定位器,因此应该首先使用. 元素名称也可以非常独特. CSS类也很棒, 特别是在使用独特的CSS类形成的网页上.
有时非常希望使用实际链接文本作为选择器, 因为测试可以在选择页面元素时直接在界面上捕获任何拼写错误或功能问题.
问:简要解释一下高级CSS选择器的用法.
当一切都失败时, 高级CSS选择器是在页面上查找元素或元素组的最佳选择. 下面是一些最常用的:
Direct child: div > a
子或子:div a
具体id: div#myid a
Specific class: div.myclass a
特定匹配:ul#mylist li:n -child(2)
CSS选择器也可以用于搜索页面的内容,但这是一个单独的主题.
问:如果有两个元素没有任何区别,你该怎么办?
偶尔会出现这样的情况:页面上的两个元素的HTML / CSS标签的每个部分都完全相同, 包括元素文本, 但它们确实有不同的功能需要自动化. 有多种方法可以解决这个问题:
使用findElements方法返回元素列表. 这样就可以通过索引访问列表中的任何元素
使用特定于CSS / XPATH的匹配器并精确匹配元素的出现
问:如果一个元素选择器对页面上的多个元素都是相同的,会发生什么?
只有第一次出现的元素才会被选中, 由于页面是从上到下读取的, 这将是最靠近文档顶部的元素.
Mastering Timeouts
问:说明显式等待和隐式等待的区别.
网页通常由许多不同的元素组成, such as links, paragraphs, buttons, input fields, text fields, 组合框和自定义对象. 而且大多数都是在整个页面加载时加载的, 而且加载后几乎可以立即访问它们. 但是在某些情况下,元素是异步加载的, 等待服务器响应, 或者来自外部服务提供者的响应.
当您知道一个元素是否可用于自动化的唯一方法是等待它完全加载时, Selenium WebDriver提供等待. 它们可以是显式的或隐式的. 隐式等待就像在访问元素之前总是等待3秒,或者每0轮询一次DOM.5秒来确定是否满足条件. 显式等待直接检查元素条件是否为真, 并暂停脚本执行,直到满足确切的条件, 如果在设定的持续时间后未满足,则抛出超时错误.
Implicit:
driver.manage().timeouts().TimeUnit implicitlyWait (5.SECONDS);
Explicit:
WebDriverWait = new WebDriverWait(driver, 5);
wait.直到(ExpectedConditions.elementToBeClickable(通过.id("myid")));
As you can see, 隐式等待是在驱动级完成的, 这样每当打开一个新页面, 在实际的元素查找完成之前, 司机将等待至少5秒. In reality, 在某些情况下,你必须将两者结合使用, 尽管显式等待通常被认为是更好的实践. 在测试可以变得更可靠的情况下,隐式等待肯定更好. 使用显式等待将使测试工作得更快,这也是非常重要的. 明智地使用等待是关键. 如果应用程序使用大量AJAX, 适当的等待状态对于使自动化可靠地工作至关重要.
HTTP Rules
那么,当你从一个页面导航到另一个页面时,浏览器中实际发生了什么? web上的一切都是从向服务器发出HTTP GET请求开始的,并从服务器获得各种不同形式的响应, 是完整的网页, images, 保存应用程序上下文中使用的数据的声音或简单响应. 今天的互联网是多种技术的混合体, but in its core, 它仍然是那个从一开始就统治互联网的旧HTTP协议. 拥有来自众多供应商的大量api, 今天的应用程序之间的联系更加紧密,有时很难将一个应用程序与其他应用程序隔离开来. 最近出现了一种两层应用程序的趋势, 一个API层,其中所谓的微服务(后端)和UI层(前端)作为相互通信的独立工作单元. 这样的分离, Selenium测试实际上已经不仅仅是功能了, 而是一种集成测试, 它们的价值正变得更加明显.
虽然Selenium开发人员并不迫切需要了解很多关于HTTP的知识, 它可以帮助他们在很多方面实现自动化, 特别是当应用程序使用大量外部api时. 他可以记录反应,然后在测试中模拟它们的速度和可靠性, 他也可以直接进行HTTP调用,因为它们是应用程序的一部分. 他甚至可以使用自己选择的工具对API应用层进行单独的测试.
问:哪些方法在浏览器中被认为是安全的?
出于安全考虑,web浏览器中只允许使用OPTIONS、GET、HEAD、POST、PUT和DELETE. 不允许使用TRACE和CONNECT等方法. Internet Explorer等旧浏览器对HTTP方法的支持更加有限.
问:在URL中使用参数会如何影响自动化?
很多web应用程序都在url中使用参数, 这在测试特定内容时非常有用, 无需经过应用程序的复杂工作流程. 考虑一下这个例子:
driver.get("http://skuznk.sportshsc.com/companies/apply?interested_in =开发人员”)
虽然实现整个工作流程的自动化是可取的, 也可以操纵请求并直接获取其他测试所需的参数:
driver.get("http://skuznk.sportshsc.com/companies/apply?interested_in =设计师”)
By this approach, 在不经过整个应用程序工作流的情况下,可以对测试进行参数化并验证条件行为.
虽然您可以通过使用Selenium WebDriver自动化网站和应用程序来做很多事情, 会出现需要更多东西的情况. For example, 您可以将Selenium自动化与数据库测试结合起来, 验证数据是否正确存储在数据库中. 您甚至可以创建测试报告,记录自动化测试中所做的一切,并将其保存为各种格式, 以供将来参考或CI报告.
Speaking of CI, 对于Selenium开发人员来说,了解它们将是非常有益的. CI服务器是用来运行各种测试的, 构建应用程序并将它们打包成独立的包. 可以使用无头驱动程序/浏览器,比如PhantomJS在CI服务器上运行测试,或者使用 xvfb 运行真正的浏览器而不实际运行显示服务器. Whatever you choose, CI对于使测试自动化成为团队中每个成员都可以依赖的工具是无价的. 了解如何设置它们并为运行Selenium或任何其他类型的单元或集成测试做准备,对于开发的成功至关重要.
Communication
编程的核心是沟通. 不仅是人与机器之间,还有程序员之间. 使用代码与每个团队成员进行沟通是一项容易被忽视的技能, 因为让我们面对现实吧, 没有人知道明天会发生什么:其他人会加入这个项目, 应用程序的某些部分将缺少文档,没有人会知道它是如何编码的, 或者你会发现自己在每次有人尝试使用它之前都要解释代码的某些部分. 不可读的代码会让您感到悲伤,觉得您或其他人首先应该做得更好. 文档很棒,但代码本身需要尽可能清晰和沟通.
对于Selenium开发人员, 最重要的是他们对项目中的每件事都给出客观的意见, be it code, design, 特性集和实现, 并且在团队的每个成员之间来回交流. 这并不像看起来那么容易, 因为我们都是人, have our own opinions, have our own pride, 有时,这种混合会成为做出正确决策和推动项目进展的障碍. 掌握沟通不是学校能教的, 至少没有作为任何官方研究的一部分. 这是社会智力的一部分,不是每个人都有.
精通英语是在线交流的重要组成部分, 尤其是在编码和从事自由项目时. 因此,事先评估候选人的语言能力是很重要的.
Wrap Up
今天的Web项目,如果没有某种自动化作为其基础部分,是无法看到的. 使用Selenium支持的任何语言, 创建良好的自动化测试和测试套件可以提供一个安全网,确保任何回归在进入生产环境之前被捕获, 这样的发展就会变得可靠和愉快. Selenium的版本3正在制作中,它将是对已经建立的遗留版本的改进. 问题不在于你是否应该自动化, 问题在于您的团队对自动化和质量保证的投入程度, 以及你能在其中投入多少.
从第一天开始自动化项目绝对是一个最佳实践, 并且拥有一个具有开发经验的Selenium自动化工程师是一个很大的加分项.
如果您的项目仍然没有Selenium测试, 自动化是有必要的, do not hesitate. Start now! 对于软件开发和团队士气来说,差异将是巨大的. 自动化并不是一根能让所有项目问题消失的魔杖, 但这至少会让他们更显眼.