Automated tests Quicktest Pro-匹配文本后查找第一个按钮

Automated tests Quicktest Pro-匹配文本后查找第一个按钮,automated-tests,qtp,Automated Tests,Qtp,我想使用动态对象识别(描述性编程)查找在某些给定文本之后出现的第一个标记为“Delete”的按钮(例如,在文本“Item XYZ-123”之后出现的第一个Delete按钮)。如果文本和按钮都在webtable的一行中,我有一个笨拙的方法来实现它,但我希望有一个更优雅或可靠的解决方案(希望不依赖于表) 我更愿意避免使用.Object属性,因为文档声称当您在IE中测试时,.Object属性只返回DOM对象,而不是在firefox中 谢谢 假设没有更简单的方法,您可以尝试解析HTML。在HTML中查找

我想使用动态对象识别(描述性编程)查找在某些给定文本之后出现的第一个标记为“Delete”的按钮(例如,在文本“Item XYZ-123”之后出现的第一个Delete按钮)。如果文本和按钮都在webtable的一行中,我有一个笨拙的方法来实现它,但我希望有一个更优雅或可靠的解决方案(希望不依赖于表)

我更愿意避免使用.Object属性,因为文档声称当您在IE中测试时,.Object属性只返回DOM对象,而不是在firefox中


谢谢

假设没有更简单的方法,您可以尝试解析HTML。在HTML中查找搜索文本,然后从该点开始搜索HTML以查找“删除”按钮。您应该能够从HTML中提取一个id或一些其他标识属性,用于描述性编程


您是否有示例HTML和QTP代码,我们可以查看以查看更多详细信息?也许有一个更简单的方法。

这里有一个使用
sourceIndex
属性的解决方案,请注意
sourceIndex
是一个仅用于IE的属性,但QTP在Firefox上模拟了它,因此相同的脚本将在两种浏览器上工作。如果
源索引
不符合要求,您可以选择使用基于坐标的属性,如
abs\u x
abs\u y

下面的代码按要求回答问题,使其成为一般函数,留给读者作为练习;o)

此解决方案需要注意的事项:

  • 它不假设包含文本的元素有任何内容,如果您知道这是元素中的整个文本,您可以删除
    *
    s和/或添加一个“html标记”,以获得更好的性能。
    • 这就是为什么我们采用符合描述的最后一个元素,第一个元素是
      主体
      等等
  • 在文本描述中,我们必须指定“micclass”=“WebElement”,因为默认情况下,
    ChildObject
    过滤掉
    WebElement
    s,假设它们不感兴趣

让我先重新表述一下这个问题

如果行号未知,但您有唯一的键值来查找该行,如何检索对WebTable中包含的对象的引用

这适用于按钮、复选框、组合框和表中的任何其他对象

实施

1) 查找行

intRow=objWebTable.GetRowWithCellText(skeyValue文本,“项”) 可以按名称或编号指定列

2) 检索子对象

设置objButton=objWebTable.ChildItem(intRow,intCol,“WebButton”,0) 只能按数字指定列。如果在同一单元格中有多个按钮,则最后一个参数生效


查看我的博客()中的其他一些技术示例。

我猜您的问题与Browser()类似。WebElement(“html标记:=TR…”)。WebButton(“值:=Delete”)?我实际上认为这是一种很好的逻辑方式,可惜它在Firefox上似乎不起作用。如果做不到这一点,我认为莫蒂下面的解决方案是合理的。至于不使用.Object:可以使用许多变通方法在FF上实现类似的功能,但是,除非它非常重要,否则我发现花时间为IE编写额外的脚本比在QTP中反复研究FF脚本的所有不一致性更值得。不一定是在表中——尽管这是一个常见的期望。此外,在显示不同数量表的动态页面上查找正确的表可能是一个问题。我正在寻找一个通用的解决方案,因此首先在表中查找对象是有意义的,但我必须考虑到在某些情况下我在表之外查找的可能性…检查表是否定义了html id属性(每个页面的值都是唯一的)。在这种情况下,识别表不会有问题。总的来说,我关心的是,您可以真正拥有一个可靠的通用解决方案,而无需确定正确的表,因为您正在寻找的文本/按钮的上下文同样重要。如果您的脚本将在错误的表中找到正确的文本并将其报告为PASS,那么它甚至是值得的。
''#1. Create description for locator text 
Set textD = Description.Create()
textD("micclass").Value = "WebElement"
textD("innertext").Value = ".*Item XYZ-123.*"

''#2. Find locator sourceIndex
set texts = Browser("B").Page("P").ChildObjects(textD)
Set text = texts(texts.Count-1) ' Take last text '
textIdx = text.GetROProperty("source_index") ' works for FF too '

''#3. Create description for button 
Set buttonD = Description.Create()
buttonD("micclass").Value = "WebButton"
buttonD("value").Value = "Delete"
Set btns = Browser("B").Page("P").ChildObjects(buttonD)

''#4. Find first button after locator text 
For i = 0 To btns.Count
    If btns(i).GetROProperty("source_index") > textIdx Then
        btns(i).Click ' Or whatever you want to do with it '
        Exit For
    End If
Next