selenium自动化测试设计模式原文翻译(二)

尝试个人翻译selenium官方的测试设计模式篇,由于本人个人能力有限,翻译内容没有进行校对,还有很多晦涩难懂的地方,部分地方翻译出来强加了个人理解,所以本文仅供个人学习参考,文末有对应文档的官网链接可供参考。

  1. 结果验证
    1. 断言(ssert)与验证(Verify)
什么时候应该使用断言命令,什么时候应该使用验证命令?这取决于你。不同之处在于检查失败后想要做什么。你想让你的测试脚本终止,还是继续执行并记录检查失败结果?
这是一个权衡。如果您使用断言Assert,测试将在该点停止并且不运行任何后续检查。有时候,也许经常,这就是你想要的。如果测试执行失败,您将立即得知测试未通过。像TestNG和JUnit这样的测试引擎为常用的开发环境提供了插件( 第5章),这些插件方便地将这些测试脚本标记为失败。优点:您可以立即看到检查是否通过。缺点:当检查失败时,还有其他从未执行过的检查将不会执行,因此您不会有其它状态的信息。
相反,验证verify命令不会终止测试。如果你的测试只使用验证命令(假设没有例外),那么测试将运行直到完成,无论这些检查是否发现缺陷。缺点:你必须做更多的操作来检查你的测试结果。也就是说, 你不会从TestNG或JUnit获得反馈您需要查看控制台打印输出或日志输出的结果每次运行测试时,您都需要花时间浏览一下这个输出如果您正在运行数百个测试,每个测试都有对应的日志,这将非常耗时,所以断言的即时反馈将更加合适测试。由于能立即反馈,断言比验证命令更常用。
  1. 定位策略
    1. 选择定位方式
在页面上选择对象有多种方法,8种。但是,这些定位方式的作用是什么?回想一下,我们假设要找到一个对象
    • 元素的ID
    • 元素的名称属性
    • 一个XPath语句
    • 通过link's text
    • 文档对象模型(DOM)
使用元素ID或名称定位器在 测试执行性能方面效率最高,并且还会使测试代码更具可读性,前提是页面源中的ID或名称是完整的。由于浏览器必须运行其XPath处理器,因此执行XPath语句需要更多长时间。已知XPath在Internet Explorer版本7中速度特别慢。通过链接的文本来定位通常很方便且性能良好。尽管这种技术是只适用于有链接文本的定位。另外,如果链接文本会频繁变化,那么通过<a>元素的ID进行定位将是更好的选择。 注意链接文本中的关键字查询功能。
有时候,您必须使用XPath定位器。如果页面代码中没有ID或name属性,您可能别无选择,只能使用XPath定位。(DOM定位器不再被广泛使用,因为XPath可以做它做的所有事情甚至更多.DOM定位器可以简单地支持传统测试。 被废弃
使用XPath定位与通过ID或名称属性定位比较是没有优势的。使用XPath(和DOM),您可以在页面上找到相对于另一个对象的对象。例如,如果在<div>部分的第二段内必须出现链接,则可以使用XPath来指定该链接。使用ID和name定位时,只能指定它们出现在页面的某处。如果您必须测试显示公司徽标的图像出现在页眉部分的页面顶部,则XPath可能是更好的定位器。
  1. 定位动态元素
正如前面在“测试类型”部分中所述,动态元素是页面元素,其标识符因页面的每个实例而异。例如
<a class="button" id="adminHomeForm" οnclick="return oamSubmitForm('adminHomeForm',
    'adminHomeForm:_ID38');" href="#">View Archived Allocation Events</a>
这个HTML定位标记定义了一个ID属性为“adminHomeForm”的按钮。与大多数HTML标签相比,它是一个相当复杂的锚标签,但它仍然是一个静态标签。每次在浏览器中加载该页面时,HTML都将保持不变。它的ID在本页面的所有实例中保持不变。也就是说,当该页显示时,此UI元素将始终具有同样标识符。所以,为了让你的测试脚本点击这个按钮,你只需要使用下面的Selenium命令。
    click adminHomeForm
或者,在Selenium 1.0中 
    selenium.click("adminHomeForm");
但是,您的应用程序可能会在网页的不同实例中标识符不同的情况下动态生成HTML。例如,动态页面元素的HTML可能如下所示。
    <input type="checkbox" value="true" id="addForm:_ID74:_ID75:0:_ID79:0:checkBox"
name="addForm:_ID74:_ID75:0:_ID79:0:checkBox"/>
这定义了一个复选框。它的ID和name属性(都是addForm:_ID74:_ID75:0:_ID79:0:checkBox)是动态生成的值。在这种情况下,使用标准定位器将如下所示。
    click addForm:_ID74:_ID75:0:_ID79:0:checkBox
或者,在Selenium-RC中
    selenium.click("addForm:_ID74:_ID75:0:_ID79:0:checkBox");
对于动态生成的标识符,这种方法是行不通的。下次加载该页面时,标识符将与Selenium命令中的值不同,因此不会被找到。点击操作将失败,并显示“找不到元素”错误。
为了解决这个问题,一个简单的解决方案就是使用XPath定位器替代ID定位器。所以,对于复选框,您可以简单地使用
click //input
或者,如果它不是页面上的第一个输入元素(很可能不是这样),请尝试更详细的XPath语句。
click //input[3]
要么
click //div/p[2]/input[3]
但是,如果您确实需要使用ID来定位元素,则需要使用不同的解决方案。在使用Selenium命令之前,您可以从网站捕获此ID。例如:
String[] checkboxids  = selenium.getAllFields(); // Collect all input IDs on page.
for(String checkboxid:checkboxids) { // 遍历搜集到的id
    if(checkboxid.contains("addForm")) {// 判断是否包含addForm
        selenium.click(checkboxid);
    }
}

如果只有一个复选框,其ID包含文本“addForm”,则此方法将起作用。
总结一句话,定位动态元素要用xpath语句。
  1. 定位Ajax元素
定位、验证AJAX元素的最好的方式是使用Selenium 2.0 webdriver的API,它专门解决Selenium 1.0测试AJAX元素的一些限制。
  在Selenim 2.0中,可以使用 waitfor()方法来等待一个页面元素变得可用。该参数是一个WebDriver用来实现定位的By对象。这是 WebDriver的章节中详细解释。
  在Selenium 1.0(Selenium-RC的)中,要做到这一点需要编写更多的编码,但它并不难。首先检查元素,如果它存在,等待预定义的时间段,然后再重新检查。这在循环内执行,如果超过一个预定的超时,元素不存在则终止循环。
  让我们尝试在页面上点击按钮(不刷新页面)时跳转链接(link= ajaxLink)如何处理,使用循环处理:
// Loop initialization.
for (int second = 0;; second++) {
 
     // If loop is reached 60 seconds then break the loop.
     if (second >= 60) break;
 
     // Search for element "link=ajaxLink" and if available then break loop.
     try { if (selenium.isElementPresent("link=ajaxLink")) break; } catch (Exception e) {}
 
     // Pause for 1 second.
     Thread.sleep(1000);
 
}
 这当然不是唯一的解决办法。Ajax是一个共同的话题,在用户论坛上,查找一下之前的讨论,看看别人是如何做的。

原文地址:测试设计注意事项

上一节:

selenium自动化测试设计模式原文翻译(一)

下一节:

selenium自动化测试设计模式原文翻译(三)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值