我的测试应用程序是由外部供应商开发的,所以我无法控制HTML结构。该应用程序非常Javascript和Ajax,包含大量动态生成的按钮和自动完成列表。
换句话说,页面的特征是它们充满:
因此很难识别这些元素,特别是按钮。
我正在尝试写一个通用的'我点击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"> </button>
在多次使用类的情况下,ID是自动生成的,并且始终不是相同的数字。由于该类指定了图像,因此没有与该按钮关联的文本。
问题2:那我怎样才能使用&#39; findbutton&#39;通常会找到一个按钮&#39;没有具体的区别特征?请注意,我确实尝试了findbutton(&#34; button&#34;),可能会有一个&#39;按钮&#39;按钮中的某个地方,但这也不起作用。至少,它不能始终如一地工作,并且我的意思是,当我运行测试几次时,相同的测试随机似乎找到或不找到相同的按钮。
答案 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特定的问题。