用于查找表中特定行的CSS选择器:对nth-type / nth-child感到困惑

时间:2014-08-27 14:27:43

标签: java selenium-webdriver css-selectors

我有一个表可以添加元素,我需要能够找到表的特定行以进行Selenium自动化测试。我并不关心前两行 - 只是那些类名以'开头的'。我尝试将这些作为定位器来选择第一个具有类别名称的第一个表格行' something'。 Selenium抛出异常试图与这些元素进行交互。我做错了什么......

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);
}

1 个答案:

答案 0 :(得分: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];
}