2014-01-27 37 views
0

我有一些200個元素是誰的加價如下:驗證頁面上的200名單元素的webdriver

<span id="1356329740258" class="pagename">Sport & leisure</span> 
<span id="1356329740259" class="pagename">Food & drink</span> 
<span id="1356329740260" class="pagename">Household</span> 
<span id="1356329740261" class="pagename">Gardening</span> 

我可以用webdriver的訪問它們在一個相當醜陋的方式:

List<WebElement> elements; 
elements = driver.findElements(By.xpath(".//*[starts-with(@id, '135')]")); 

...因爲每個都以'135'開始。 但driver.findElement(By.cssSelector(".pagename"); ......不工作,也許事情做的'標籤

我現在需要做的,是對列表中的每個元素做.getText(),並驗證其對預期,相應的數組值。我開始關閉該方法的想法是:

String[] expected = {"Sport & leisure", "Food & drink", "Household", "Gardening"}; 
List<WebElement> elements = select.find.Elements(By.xpath(".//*[starts-with(@id,'135')]")); 

// compare #array items with #found elements in List 
    if (expected.length != elements.size()) { 
    System.out.println("the wrong number of elements were found"); 
    } 

// check value of every pagename class element equals expected value 
    for (int i = 0; i < expected.length; i++) { 
    String elementsValue = elements.get(i).getAttribute("value"); 
    if (elementsValue.equals(expected[i])) { 
     System.out.println("passed on: " + elements); 
    } else { 
     System.out.println("failed on: " + elements); 
    } 
} 

這具有潛在的具有存儲在陣列中200個奇數文本串的明顯的限制,因此將變得笨拙。有沒有更優雅的解決方案?我可以從.csv中讀取數組值,並使用Parameterized runner,但是仍然需要在構造函數中聲明每個值。

+0

至於你的問題「有沒有更優雅的解決方案?」我認爲你做這件事的方式非常優雅。你正在循環着每一個,我認爲這非常好。不確定是否真的有「更好」的解決方案。 – sircapsalot

+0

謝謝。感謝您的意見 – Steerpike

+0

公平警告 - 'WebDriver.findElements()'不指定元素的順序。您的循環可能會或可能不會工作,並且結果可能會因您使用的瀏覽器驅動程序而異。 –

回答

4

您可以使用列表containscontainsAll函數來確定相等性。所以基本上是這樣的:

final List<String> expectedElements = readFromCSV("expectedElements.csv"); 
final List<WebElement> elements = select.find.Elements(By.xpath(".//*[starts-with(@id,'135')]")); 

final List<String> stringElements = new ArrayList<>(elements.length); 
for (WebElement element : elements) { 
    stringElements.add(element.getAttribute("value")); 
} 

final boolean isSame = stringElements.containsAll(expectedElements); 
+0

看起來像我需要的解決方案!謝謝 – Steerpike

1

這不是直接回答你的問題,但只有少數更正代碼:

1.

您可以替換代碼,您考慮「醜」:

List<WebElement> elements = select.findElements(By.xpath(".//*[starts-with(@id,'135')]")); 

與使用他們的class屬性找到的元素代碼:

List<WebElement> elements = select.findElements(By.xpath("//span[@class='pagename']")); 

2.

由於這些元素不具有value屬性,則應更換以下行:

String elementsValue = elements.get(i).getAttribute("value"); 

有了:

String elementsValue = elements.get(i).getAttribute("innerHTML"); 
+0

謝謝barak--感謝你的貢獻。 – Steerpike

相關問題