首页 文章

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

提问于
浏览
0

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

以下是我的尝试:

ul class = classname> xxx - 2天前的GSA

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

    假设#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]", " "));
    
  • 0

    我终于可以检索li下的选项了 . 这就是我所做的,它适用于(WebElement MyListOptions:listOfLiTags){

    String myoptions=serchOptions.getAttribute("<<The actual attribute value which is storing my options>>");
    
              System.out.println("THE List Options are" + txt3);
          }
    

相关问题