2014-08-27 71 views
0

我有一張可以添加元素的表格,我需要能夠爲Selenium自動化測試找到特定的表格行。我不關心前兩行 - 僅僅是那些以「something」開頭的類名。我試圖用這些定位器來選擇第一個具有以「something」開頭的類名的表格行。硒會拋出異常,試圖與這些元素相互作用。我在做什麼錯了....用於在表格中定位特定行的CSS選擇器:關於第n型/第n子型的困惑

div.elements table.table tbody tr.something:nth-child(1)
div.elements table.table tbody tr.something:nth-of-type(1)

<div class="elements"> 
    <table class="table"> 
     <tbody> 
      <tr class="no-data hide"> 
      <tr class="no-data hide"></tr> 
      <tr class="something something_fa4743bd-0ada-4c74-bae0-351ddc322f7d"> 
      <tr class="something something_e357d71c-559f-4ea1-bc7d-489537ab083e"> 
      <tr class="something something_71d6b3f7-df45-4283-a669-bfbcfccd7d0f"> 
     </tbody> 
    </table> 
</div> 

這裏是我遇到問題的方法。所以基本上,這是一個數據輸入表單。如果你想添加另一個條目,你點擊一個按鈕,會出現一個新行。該方法返回新條目的行號,以便可以進一步與新行進行交互。

private static final String somethingEntryRowCss = "div.scrolling-table table.table tbody tr.hostname"; 

public final int clickAddSomethingButton() { 
    int count = countEntries() + 1; 
    addSomethingButton.click(); 

    ComponentLoader.waitForElementVisible(driver, 
      By.cssSelector(somethingEntryRowCss + ":nth-child(" + count 
        +")"));  
    return count; 
} 

這裏是ComponentLoader.waitForElementVisible(driver, By)方法檢查是否新行是點擊按鈕後可見。這是超時在等待元素可見:

public static final WebElement waitForElementVisible(final WebDriver driver, 
    final By locator) { 

    try { 
     Wait<WebDriver> wait = setWait(driver); 
     wait.until(ExpectedConditions.visibilityOfElementLocated(locator)); 
     break; 
    } catch(NoSuchElementException nsee) { 
     logger.trace("NoSuchElementException. Element is not visible.); 
    } catch(TimeoutException toe) { 
     logger.trace("TimeoutException. Element is not visible.); 
    } 
    return driver.findElement(locator); 
} 
+0

那麼**拋出什麼**異常? – Arran 2014-08-27 16:32:25

+0

這是一個輔助方法拋出的超時異常。我已更新我的問題以添加更多信息。 – Selena 2014-08-27 18:16:20

+0

實際上,如果我嘗試在超時異常的catch塊內獲取元素的類名,我得到一個NoSuchElementException異常。所以,問題實質上是定位器沒有這樣的元素。 – Selena 2014-08-27 18:44:05

回答

0

也不肯定的Java代碼的正確性,但是這看起來應該像

//This will return exactly first tr with class .something 
IWebElement element = driver.findElement(By.Css(".table .something")); 

LITTLE UPDATE

好,如果我再次正確地理解了你=),並且如果你想通過它的索引訪問它,你可以嘗試使用下一個方法

public void Test() 
{ 
    var row2 = GetSomethingRow(1); 
    //You can do anything now with this row 
    row2.getText(); 
} 

public IWebElement GetSomethingRow(int index) 
{ 
    var elements = driver.findElements(By.Css(".table .something")); 
    return elements[index]; 
} 
+0

我可以輕鬆找到與該選擇器匹配的Web元素。我試圖針對使用n型或n型孩子的特定元素。 – Selena 2014-08-27 15:51:47

+0

對不起,不明白。你想要瞄準什麼元素? – 2014-08-28 03:04:32

+0

我希望能夠針對特定的行。我需要編寫自動化測試來添加行,刪除行,更改行中的值。我需要能夠指定一個行號並獲取該元素。我不關心類名稱爲「no-data」的兩行。我希望能夠使用我的基本CSS定位器:'div.elements table.table tbody tr.something'來獲得,例如,匹配這個定位器的第二行,或第三或第四等, – Selena 2014-08-28 13:48:30