由于Parasoft针对Selenium测试的新产品Parasoft Selenic,我最近学习了如何使用Selenium。我已经具有Web测试、编写Java代码和JUnit的经验,但是我以前从未使用过Selenium。以下是一些有用的资源,我发现这些资源有助于提高效率。
什么是Selenium?
首先是要确保您了解Selenium IDE和Selenium WebDriver之间的区别。我以为Selenium IDE是一种基于Selenium WebDriver的GUI记录/播放程序,是入门的好方法,但是我很快发现自己遇到了局限性,在定位器错误/丢失的情况下,播放无法成功进行,并意识到任何认真的Selenium测试人员都在使用Selenium WebDriver编写代码。完了,我不得不开始编写代码。
Selenium WebDriver入门
Selenium WebDriver库可用于几种不同的语言,从而使Selenium可以被许多人访问。由于我最喜欢用Java编写代码,因此我坚持了这一点。(此外,尽管Java进行Selenium测试不需要JUnit,但我不明白为什么有人不使用它,因为它附带了许多专门用于用Java编写测试用例的功能。)
最后,如果我要编写JUnits,那么我想我也可以在IDE中编写它们。有两种IDE在行业中最常用于Java:Eclipse和IntelliJ。我的大部分职业都是使用Eclipse,因此我坚持使用它。
做出这些决定之后,我就可以开始了。
Selenium要知道的技能
在开始之前,请确保您具有一些必备的技能,以掌握测试自动化的基础知识。
网络技能
熟悉HTML和CSS:您不应该担心网站的页面源,并且应该了解页面源如何转换为您在浏览器中看到的内容。如果HTML对您来说完全陌生,那么我建议您进行一些基础教育。这是一个很棒的网站,对我的早期教育网络有所帮助:
https://www.w3schools.com/
浏览器的开发人员工具和XPath:另一个基本技能是了解如何在页面上定位元素。Selenium WebDriver支持多种执行此操作的机制,您很快就会了解它们。您可能会希望使用浏览器的开发人员工具来轻松找到页面上的元素,下面是一个很棒的教程,可帮助您快速使用Chrome:
https://www.toolsqa.com/selenium-webdriver/inspect-elements-with-chrome-developer-tools/
编码技巧
如果您希望过渡到测试自动化工程职位,则需要发展一些编码技能。在您惊慌失措之前,好消息是,在Selenium中编写代码以自动执行Web测试相对容易。实际上,我认为Selenium是学习编码的好方法。您将要编写的代码受到严格限制,因此您不太可能完全不知所措。寻找免费的教程和课程可以帮助您开始使用所选择的语言,这并不难。为了学习Selenium需要了解的内容,我找到了一个很棒的教程,涵盖了Java和Selenium,适合初学者使用:
https://www.toolsqa.com/selenium-tutorial/
如果您确实选择Java,那么我还建议您学习JUnit,这是Java的流行测试框架。这是一篇很棒的教程,涵盖了JUnit,最后一课涵盖了将JUnit与Selenium测试结合使用:
https://www.toolsqa.com/java/junit-framework/junit-introduction/
设置环境
除了toolsqa的教程之外,我发现自己经常光顾的另一个资源是:
https://www.softwaretestinghelp.com/selenium-tutorial-1/
这两个资源将涵盖使用Eclipse,Java,JUnit 4,Selenium WebDriver和Maven设置环境所需的所有主题。
......行家?那是什么?我要发表的评论是,我发现大多数教程都将Maven作为高级话题排在了后面。Maven是一个构建工具,可利用其所有必需的依赖项来简化对代码的编译、测试和部署。像JUnit一样,Maven是另一个可选项目,但我现在想提出来,因为一旦知道要做什么,它会使您的项目设置更加容易。如果您从Maven开始,那么您以后就不必考虑将Java项目转换为Maven项目,只需从一开始就从Maven开始!我最喜欢的教程来自:
https://www.softwaretestinghelp.com/maven-project-setup-for-selenium-selenium-tutorial-24/
您的第一个Selenium脚本
我提到的两个教程参考都很好地指导您完成创建第一个脚本的过程。toolsqa文章假设您缺乏编码知识,并且softwaretestinghelp链接涵盖了更多领域,但是它们都很出色:
https://www.toolsqa.com/selenium-webdriver/selenium-test/
https://www.softwaretestinghelp.com/selenium-webdriver-tutorial-10/
一旦第一个脚本启动并运行,并且对JUnit有所了解,toolsqa的JUnit教程的最后一课将帮助您将初始脚本重构为JUnit格式:
https://www.toolsqa.com/java/junit-framework/junit-test-selenium-webdriver/
Selenium中的页面对象模型
在熟悉了Selenium基础知识并拥有一个可以在浏览器中播放一两个场景的脚本之后,就应该准备好进入下一个层次了。页面对象模型是组织Selenium测试代码以使其更易于维护并减少重复代码的一种方式。到目前为止,我的测试已将所有测试代码包含在测试方法中。因此,我经历了一个两步过程,首先将现有测试重构为Page Object Model,然后再次重构以使用Page Factory模式对其进行优化。这是一个有启发性的两步过程,我只能想象如果我跳过这些最佳实践并在测试之后疯狂地创建测试,会后悔多少。如果您在Parasoft Selenic中使用Smart Recorder,则可以自动执行此操作。这是我用来对该主题进行自我教育的一些指南:
https://www.guru99.com/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html
https://www.swtestacademy.com/page-factory-selenium-webdriver/
如果要获得相同的结果似乎需要额外的工作和额外的代码,那您是对的。而且,如果您只打算进行1或2个测试,那么也许这有点过头了,但是对于测试自动化工程师而言,情况绝非如此。当您构建一个包含100或1000多个测试的强大的回归测试套件时,这种模式最终使世界变得有意义。从长远来看,代码重用将为您节省大量时间。
元素位置
在尝试使用Selenium脚本时,您将开始理解为什么我在页面上列出定位元素是一项必要技能。您将在浏览器的开发人员工具扩展A LOT中找到自己,并开始尝试XPath。尽管有许多方法可以使用Selenium在页面上定位元素,但是XPath是最灵活,功能最强大的方法之一。如果您无法通过简单的策略(例如使用ID,名称或链接)来唯一地标识元素,那么您将使用XPath或CSS定位器。任何相当复杂的Selenium测试都将在这里或那里需要一些XPath来定位顽固的页面元素,而XPath带来的效果越好,测试人员的效率就越高。
好的,Wilhelm,XPath很棒,除了这里的家庭作业,还能给我带来更多好处吗?其实,是!还有一个漂亮的Chrome扩展程序(也可用于Firefox),称为TruePath。这个插件做了不错的工作,提供了推荐的XPath列表供您选择,您可以将它们复制/粘贴到Selenium定位器代码中。它并不总是完美的,但是我发现它可以帮助我展示我立即喜欢的Relative XPath,或者展示与我喜欢的东西足够接近的Relative XPath,然后我可以以此为起点进行调整。
使用jQuery的AJAX智能等待
一旦定位元素成为第二天性,您很可能会遇到另一个常见问题。您正在测试的Web应用程序具有浏览器正在对服务器进行的AJAX(异步JavaScript和XML)调用,而您的Selenium脚本正在执行这些操作,从而使浏览器没有足够的时间来完成对异步流量的处理。我正在测试的电子商务网站存在此问题,我的Selenium测试是如此之快地单击“添加到购物车”,然后单击“查看购物车”,以至当它到达购物车页面时,购物车是空的!我需要告诉我的Selenium测试在单击“查看购物车”之前要等待适当的时间,但是该怎么做呢?
本教程涵盖了一些与等待条件相关的基本Selenium课程,但似乎没有一个适合于此类异步和动态的课程。我如何预测Web服务器需要多长时间响应?我是否高估了安全性并使测试速度慢于需要的速度?有没有更好的办法?原来有。如今,许多现代Web框架都在使用jQuery库来支持对后端服务器的AJAX调用。 Selenium WebDriver允许我执行JavaScript作为测试步骤,并且我可以执行一些JavaScript以检查jQuery的状态,以提示浏览器何时完成与网络服务器的对话,并且可以继续进行。我发现它深深地藏在toolsqa网站中(有趣的是,它不属于Selenium教程的一部分):
https://www.toolsqa.com/selenium-cucumber-framework/handle-ajax-call-using-javascriptexecutor-in-selenium/
对于初学者来说,这些额外的信息非常有用,但是,如果您想要的是更重要的内容,那么以下是关于同一主题的简洁文章:
https://automationrhapsody.com/efficiency-waiting-for-ajax-call-data-loading-with-selenium-webdriver/
管理变更
我要与您讨论的最后一个话题是困扰所有管理变更的Selenium测试人员的话题。Web测试自动化的缺点之一是UI更改的频率以及它如何影响自动化测试的稳定性。身为测试自动化工程师,您很快就会习惯于故障排除过程,以排除为什么测试一直无法执行的原因,以及是否满足以下条件:
您的考试有问题
环境问题
对应用程序的无害更改(即不是错误)
对应用程序的意外更改(即真正的错误!)
自动化测试失败会导致很多错误警报,这不是因为它们发现了一个错误,而是因为它们需要维护或环境存在问题。
一种有助于最大程度地减少这一普遍问题的策略之一,我已经在“元素位置”中进行了介绍。当测试无法找到Element时,通常是因为它使用的定位策略在应用程序的最新部署中不再有效。在这里,元素的定位方式很重要,因此,让我们讨论一个示例,该示例如何编写可适应变化的定位器:
如果考虑这样的元素的绝对XPath:
/html/body/div[25]/div[2]/div/span/section[2]/div/h2/p
亲爱的,对HTML的任何细微改动都会破坏这一点。 如果您像这样构造一个相对XPath:
//p[@id='8232:0'][contains(.,'Guidance for Success')]
这样,您的测试就更有可能获得成功。注意单词“更好的机会”。有时,应用程序会发生很大变化,以至于您根本不走运。但是编写更具弹性的测试将减少自己将来工作的机会。(或者您可以查看Parasoft Selenic。)
等待中也存在相同的问题。由于等待条件的原因,很多因素都可能导致测试自动化的不稳定。在AJAX上使用诸如智能等待之类的策略使用jQuery将帮助您减少由于等待条件而需要解决测试问题的可能性。在进行主题讨论时,以下是有关Selenium中等待的有用教程:
https://www.softwaretestinghelp.com/selenium-webdriver-waits-selenium-tutorial-15/
不过,就像元素位置一样,有时您会变成S-O-L,并且不可避免地需要维护。
总结
学习Selenium的经验使我感谢您在成为测试自动化工程师的过程中可能面临的挑战。如果您是新手并且感到被吓到了,请记住,这比您想象的要容易,并且您将很快成为专家级的自动化网络测试人员。
作者:佚名