2017-04-05 58 views
0

这里是新手。我正在对自动化测试进行第一次尝试,并且我正在测试的网站使用AngularJS来生成动态图形和条形图以及不断变化的数据和div ID。由于我不懂代码,我正在寻找使用Robot Framework和相关Xpaths的测试脚本。我的XPath知识大多来自W3学校茎的XPath教程(https://www.w3schools.com/xml/xpath_syntax.aspRobot Framework和Xpath - 使用条件选择一个元素

这是目前我测试页面的一部分的基本骨架:我已经包含ExtendedSelenium2Library在图书馆

<html> 
    <body> 
     <div class="charts_and_graphs"> 
      <div class="bar_chart"> 
       <h1>Book Sales</h1> 
       <div class="key_area"></div> 
       <div class="bar_area"> 
        <div class="bar">a1</div> 
        <div class="bar">a2</div> 
        <div class="bar">a3</div> 
       </div> 
       <h1>Pen Sales</h1> 
       <div class="key_area"></div> 
       <div class="bar_area"> 
        <div class="bar">b1</div> 
        <div class="bar">b2</div> 
        <div class="bar">b3</div> 
       </div> 
       <h1>Bag Sales</h1> 
       <div class="key_area"></div> 
       <div class="bar_area"> 
        <div class="bar">c1</div> 
        <div class="bar">c2</div> 
        <div class="bar">c3</div> 
       </div> 
      </div> 
     </div> 
    </body> 
</html> 

我的机器人脚本,到目前为止,我的测试情况是这样的:

Click on the first bar of the Book Sales bar chart 
    Click Element xpath=//child::div[@class="bar_chart" and ./h1/text()="Book Sales"]//div[@class="bar" and 1] 

不用说,我的测试案例失败,出现以下错误:

ValueError: Element locator 'xpath=//child::div[@class="bar_chart" and ./h1/text()="Book Sales"]//div[@class="bar" and 1]' did not match any elements. 

这里是我的Xpath的崩溃,我试图遵循的逻辑:

//子:: DIV [@类= “bar_chart” 和./h1/text()="Book销售“]应该选择任何一个div的子节点,其级别为bar_chart和谁有孩子h1节点包含字符串图书销售

在这一选择,// DIV [@类= “栏” 的1]”旨在选择它的类是酒吧第一 DIV节点。

我真的很感激任何提示或指示,可以帮助我实现自动点击图书销售图的第一栏而不依赖于id属性的目标(它们会在每次刷新页面时都会发生变化),那会即使条形图在页面周围移动也是如此(图表本身的结构不太可能改变,但是图表的排序可能会改变,或者整个charts_and_graphs div可能会移动到页面的顶部/底部......感谢前进!

+0

我将文本内容a1-3,b1-b3,c1-3添加到示例中的'div.bar'元素以进行说明。你能告诉我们(根据这段文字内容)你想选择哪个'div.bar'元素? – wero

+0

我正在尝试选择a1栏。 – Majin

回答

0

让我试着解释一下没有你的表情工作,然后给一个样品应于预期的目的做。

在F你的表情的第一路 - // child :: div [@ class =“bar_chart”and ./h1/text()="Book Sales“] - 不知道你认为它的确如此。
它选择所有具有直接后代(小孩)为div的元素,并使用该类值,并将h1子本身与文本结合在一起。换句话说,它选择<div class="bar_chart">

现在,从它下来,//div[@class="bar" and 1]将选择具有类值的div,就是这样。 1将不会成为您希望的元素位置 - and将建立逻辑连接,并且1将始终评估为真 - 即不需要。

我不能说为什么它没有找到元素失败,你提供的xpath样本返回所有div节点class="bar"(你可以尝试自己here)。

假设位置条件固定工作 - 那么表达式仍然不会返回您期望的结果,如第二部分,它将返回class =“bar”的第1个div。如果“售书”在“图书销售”之前呢?那么,你会得到第一个项目,虽然你在本书之后。


现在,让我们开始与 - 让这对图书销售的DIV:

//h1[text()="Bag Sales"]/following-sibling::div[@class="bar_area"][1] 

这个表达式将得到h1与目标文本,然后将选择它的第一个后续div兄弟。现在,我们定位在正确div涵盖酒吧,让带班“吧”的第一个孩子是很容易:

/div[@class="bar"][1] 

因此,充分表达是:

//h1[text()="Bag Sales"]/following-sibling::div[@class="bar_area"][1]/div[@class="bar"][1] 

顺便说一句,获取此源的正确xpath的主要问题是结构 - 所有目标元素都处于平面布局,而不是分层分组(例如h1div,class =“bar_area”以common div分组)。我想你不能控制它,但如果它是一个等级结构,那么处理它将会是微不足道的。

+1

谢谢您的帮助!我也很欣赏链接到freeformatter工具,这是对我的小范围调试工具的欢迎。 – Majin