2011-02-25 155 views
5

我正在做一些使用Selenium IDE的Web應用程序測試,並且希望引入一些隨機性來展開我們的測試。我目前使用Selenium的storeAttributeValue,在那裏你給它一個XPath表達式,並且它存儲了匹配它的第一個元素(sorta)。不過,我不想存儲第一場比賽,我希望它隨機選擇一個子節點。XPath隨機選擇子節點

例如

//table[@id='mytable']//tr選擇此表的所有tr孩子。 //table[@id='mytable']//tr[0]選擇第一TR(假設現在嵌套表) //table[@id='mytable']//tr[3]選擇第三TR等

是否有某種方式(完全的XPath),我可以說「給我一個隨機TR」,即//table[@id='mytable']//tr[SOMETHINGHERE]其每次我'evalulate'/'run'它會返回一個位於集合//table[@id='mytable']//tr中的tr節點。

+0

'// table [@ id ='mytable'] // tr [0]'因爲'[0]'將被擴展爲'[position()= 0],所以什麼也不選。 – 2011-02-25 15:49:20

+0

@Ajjandro哎呀!糾正。怪一個星期五下午昏昏欲睡 – Rory 2011-02-25 16:02:02

+0

你是什麼意思的「隨機」?請注意,我們處於聲明環境... – 2011-02-25 16:03:32

回答

4

如果XPath表達式不會從一次調用更改爲另一次,並且輸入源也將相同,那麼您將需要通過參數化提供差異,否則與相同的輸入將始終輸出相同的結果這就是爲什麼我對聲明範例發表評論)。

喜歡的東西:

/table[@id='mytable']/tbody/tr[$pseudoRandom mod count(../tr) + 1] 

如果有將是每個輸入源的一個評價,XPath的最簡單的僞隨機性會

/table[@id='mytable']/tbody/tr[count(//node()|//@*) mod count(../tr) + 1] 

換句話說,使得一些僞隨機性以整個輸入源的某些屬性作爲種子進行計算。

0

構建動態的XPath表達式,然後評估其:

/table[@id='mytable']/tbody/tr[position() = {yourRandom}] 

其中

{yourRandom}

必須在XPath表達式的 「骨架」 以獲得的隨機數被取代在託管XPath的PL中。

例如在C#中,將使用string.Format()方法構造XPath表達式。

如果您使用的是XSLT,那麼調用轉換的代碼可能會提供一個以XML片段編碼的隨機數序列作爲外部參數。然後,XSLT代碼將爲每個XPath表達式使用每個連續的隨機數。

2

如果你正在使用bash命令行,你可以從$隨機變量的僞隨機數像這樣:

/table[@id='mytable']/tbody/tr[floor('"${RANDOM}"' mod count(../tr)+1)] 

這是我能同時使用xmllint來嘗試得到一個隨機數的唯一途徑,得到一個隨機的子節點。這裏是使用xmllint和一些FILENAME的命令。xml:

xmllint --format --recover --xpath '/table[@id='mytable']/tbody/tr[floor('"${RANDOM}"' mod count(../tr)+1)]' FILENAME.xml