3

我目前在获取表的标题标题以进行验证时遇到问题,它在第 6 列之前工作良好,因为当它转到下一个不可见的 .getText() 时,它是空白的。我没有xpath是正确的。

public void getAndSaveDataOfTable (final String tabla) throws FileNotFoundException{    
    WebElement element = driver.findElement(By.xpath(tabla)); 
    List<WebElement> elements = element.findElements(By.xpath("th"));
    Assert.assertTrue(elements.size() > 1);
    int cantelements = elements.size();

    for (int i = 1; i <= cantelements; i++) {   
        String data = driver.findElement(
            By.xpath(".//div[@class='ui-datatable-scrollable-header-box']//table/thead/tr/th["+ i + "]/span[1]")).getText();
        System.out.println("EL nombre del encabezado " + i + " " + data);
        datosFila.put(i, data);
    }

因此,在第 7 列和第 20 列之间,我无法获取标题的文本。

4

2 回答 2

4

如果您要JavascriptExecutor多次使用(您说您的问题在多列 7-20 上),我建议您可以通过只运行 JS 一次然后在 Java 中迭代来进行优化,而不是为每个操作再次运行 JS。JavascriptExecutor速度很慢,通过避免 12 次以上的额外 JS 执行,您将在总测试时间上节省整整几秒钟。

// JavaScript to get text from tHeads
String getTheadTexts =  
"var tHeads = []; " +
"for (i = o; i < 20; i++) { " +
    "var cssSelector = 'div.ui-datatable-scrollable-header-box table thead tr th' + i + ' span:nth-of-type(1)'; " +
    "var elem = document.querySelector(cssSelector); " +
    "var elemText = ''; " +
    "if ((elem.textContent) && (typeof (elem.textContent) != 'undefined')) { " +
        "tHeads.push(elem.textContent); " +
    "} else { " +
        "tHeads.push(elem.innerText); " +
    "} " +
"} " +
"return tHeads; ";

// Execute the JS to populate a List
List<String> tHeadTexts = (ArrayList<String>) js.executeScript(getTheadTexts);

// Do some operation on each List item
int i = 0;
for (String data: tHeadTexts){
    System.out.println("EL nombre del encabezado " + i + " " + data);
    datosFila.put(i, data);
    i++;
}
于 2013-09-10T18:45:49.543 回答
3

我遇到了听起来像你遇到的事情。看看我的帖子

如果元素在屏幕上不可见,则 WebElement getText() 是 Firefox 中的空字符串

我最终通过使用一点 JavaScript 将列“放入视图”来解决它。希望这可以帮助你。

private void scrollToElement(WebElement element){
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", element);
}
于 2013-09-10T14:13:49.213 回答