无法打印与li标签关联的文本

时间:2016-12-16 12:55:10

标签: selenium webdriver

我有一个带有下拉菜单的Google搜索栏,其中的选项属于UL和li下的实际选项。我无法检索li的数据字段,而我能够检索计数。尝试过使用List元素并通过它循环,但没有运气。所有选项的下拉都不可见。 我必须使用Selenium Web驱动程序打印与li相关的标题。

以下是我的尝试:

ul class = classname> xxx - GSA 2天前

wb.findElement(By.xpath( “<>” 中))点击(); List items = html_list.findElements(By.tagName(“li”)); System.out.println(“元素的大小是”+ items.size()); for(WebElement item:items){html_list.sendKeys(Keys.DOWN); //模拟视觉运动 wb.manage()。timeouts()。implicitlyWait(1000,TimeUnit.SECONDS);的System.out.println(item.getText());  }

2 个答案:

答案 0 :(得分:0)

假设#1:点击第1行后,您不会等待页面加载。 li 元素位于DOM中,但它们未完全加载。您可以通过在第1行和第2行之间引入延迟来测试该假设。我有用于等待页面加载的代码,但具体取决于JavaScript框架(例如jQuery,AngularJs),加载微调器实现和浏览器readystate 。我的状态逻辑看起来像这样:

/**
 * Wait for browser readystate to be complete. But don't wait forever.
 * 
 * @param webDriver
 */
public void waitForBrowserReadystateComplete(WebDriver webDriver) {
    for (int a=0; a<20; a++) {
        JavascriptExecutor javascriptExecutor = (JavascriptExecutor) webDriver;
        if (javascriptExecutor.executeScript("return document.readyState")
                .toString().equals("complete")) {
            break;
        }
        sleepResponsibly(500);
    }
}

public void sleepResponsibly(int timeMillisecond){
    try{
        Thread.sleep(timeMillisecond);
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt(); 
        throw new RuntimeException(ex);
    }
}

Hypthosis#2:文本节点很复杂。当文本节点编码复杂格式时,我遇到方法getText()失败以返回文本。我通过调用以下内容来解决这个问题:

public static String getTextFromElementsTextNodes(WebDriver webDriver, WebElement element) throws IllegalArgumentException {

    String text = "";
    if (webDriver instanceof JavascriptExecutor) {
        text = (String)((JavascriptExecutor) webDriver).executeScript(
                "var nodes = arguments[0].childNodes;" +
                "var text = '';" +
                "for (var i = 0; i < nodes.length; i++) {" +
                "    if (nodes[i].nodeType == Node.TEXT_NODE) {" +
                "        text += nodes[i].textContent;" +
                "    }" +
                "}" +
                "return text;"
                , element);
    } else {
        throw new IllegalArgumentException("driver is not an instance of JavascriptExecutor");
    }
    return text;
}

需要注意的是getTextFromElementsTextNodes()可能会返回非ASCII字符,因此我执行以下操作:

System.out.println(getTextFromElementsTextNodes(wb,item).replaceAll("[^\\x00-\\x7F]", " "));

答案 1 :(得分:0)

我终于可以检索li下的选项了。这就是我所做的并且有效   for(WebElement MyListOptions:listOfLiTags){

           String myoptions=serchOptions.getAttribute("<<The actual attribute value which is storing my options>>");

          System.out.println("THE List Options are" + txt3);
      }