Behat / Mink - 找不到按钮

时间:2014-04-23 19:35:06

标签: xpath behat mink

我的测试应用程序是由外部供应商开发的,所以我无法控制HTML结构。该应用程序非常Javascript和Ajax,包含大量动态生成的按钮和自动完成列表。

换句话说,页面的特征是它们充满:

  • 没有固定ID的元素(ID即时生成并具有 动态添加数字或其他文字)
  • 某些课程也是如此
  • 大部分时间按钮都没有与之关联的文字,因为它们要么是自定义编码的,要么是#39; down'查找列表的箭头 (不是查找列表但隐藏的div)或者' +'和' - '图标来 最大化或最小化部分内容。 -

因此很难识别这些元素,特别是按钮。

我正在尝试写一个通用的'我点击y'附近的按钮。步骤的类型,这样就不需要对每个按钮进行硬编码(假设我甚至可以用它来识别它们)。

这背后的想法是,通常至少有一个靠近按钮的标签。

我想要的是找到文本标签,然后查看同一范围内是否有按钮,如果没有,请移动'返回'通过父元素,并检查每个父级别范围内是否有一个按钮,最多5个父级。

这种方法可能存在各种各样的问题,但我很想知道这是否会起作用。我遇到了一些问题。

首先我尝试使用Xpath,因此我通过以下方式获得了父路径的Xpath:

$parentelement = $element->getParent();

$parentXpath->getXpath();

这会给我一个Xpath:(//html//span[text()='Cost center'])[1]并且一直向上移动父元素,它们会连续变为:

(//html//span[text()='Cost center'])[1]/..[1]

(//html//span[text()='Cost center'])[1]/..[1]/..[1]

等等。

实际按钮位于:(//html//span[text()='Cost center'])[1]/..[1]/..[1]//button,但它必须遍历所有父元素才能到达,因此它将以(//html//span[text()='Cost center'])[1]//button开头,并以(//html//span[text()='Cost center'])[1]/..[1]/..[1]//button结尾它应该找到按钮。

尝试使用我使用的Xpath:

$button_element = $session->getPage()->find('xpath',$parentXpath."//button")

我很快就看到了'发现'命令将// html附加到xpath字符串的前面,以便它尝试使用的Xpath最终成为(对于每个父Xpath,但使用这个作为示例):

(//html(//html//span[text()='Cost center'])[1]/..[1])

然后我删除括号和// html,留下我:

//span[text()='Cost center'][1]/..[1]

但是当我尝试时:

$button_element = $session->getPage()->find('xpath',$strippedParentXpath."//button")

我收到以下错误:

SyntaxError: Failed to execute 'evaluate' on 'Document': The string '(//html//span[text()='Cost center'][1]/..[1]//button)[1]' is not a valid XPath expression

但是,Firepath可以执行此表达式并且不会显示语法错误,尽管它找不到实际的按钮(因为按钮实际上位于一级,Firepath可以找到它)。

所以我的问题1是:我的Xpath有什么问题我无法在查找中使用它?它看起来好像//span[text()='Cost center'][1]//button没有抛出相同的异常,因为正如我所说,我循环遍历父Xpath,它以//span[text()='Cost center'][1]//button开头。它在//span[text()='Cost center'][1]/..[1]//button上崩溃。

我的第二个选择是每次都获取父元素,从查找页面上的文本开始,然后使用findbutton功能搜索父元素范围内的按钮。

循环使用父元素(最多5个):

$parentelement = $parentelement->getParent();

$butonelement = $parentelement->findbutton('xxx');

换句话说,在父元素的范围内找到任何按钮。我遇到的问题是如何指定一个通用的按钮'。

必须将一些文本与按钮相关联(由上面的&x; xxx'描述)。

但这是应​​用程序中按钮的典型示例:

<button class="autocomplete_button" type="button" id="button_OM_1">&nbsp;</button>

在多次使用类的情况下,ID是自动生成的,并且始终不是相同的数字。由于该类指定了图像,因此没有与该按钮关联的文本。

问题2:那我怎样才能使用&#39; findbutton&#39;通常会找到一个按钮&#39;没有具体的区别特征?请注意,我确实尝试了findbutton(&#34; button&#34;),可能会有一个&#39;按钮&#39;按钮中的某个地方,但这也不起作用。至少,它不能始终如一地工作,并且我的意思是,当我运行测试几次时,相同的测试随机似乎找到或不找到相同的按钮。

2 个答案:

答案 0 :(得分:0)

我正常使用css选择器,我用它来导航到按钮所在的类和ID。
它比我想的xpath容易,就像你可以使用

 $this->getSession ()->getPage ()->find ( 'css', '.parrent1 .parrent2 .autocomplete_button ' );

我认为这会帮助您,因为您知道在每个场景中使用哪个按钮

答案 1 :(得分:0)

在对此问题进行更多调查后,我发现了以下内容: 我尝试通过遍历div的范围并在文本周围(使用xpath)遍历'up'来找到最接近文本的按钮的方法实际上正在工作。

什么是无效的是SAHI,我用它作为网络驱动程序。换句话说,它不是Behat / Mink问题,而是SAHI特定问题。

我使用Selenium2尝试了相同的代码,它执行得非常完美。

我仍然需要回答问题2 - 如何在没有特定参数(如ID,名称或值)的情况下使用findbutton()但我会看到我是否可以单独找到该问题的答案并在Behat用户身上找到答案因为我认为这是Behat / Mink特定的问题。