2017-04-05 60 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