Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java selenium chrome驱动程序的getText()方法有时返回空字符串_Java_Selenium_Selenium Chromedriver - Fatal编程技术网

Java selenium chrome驱动程序的getText()方法有时返回空字符串

Java selenium chrome驱动程序的getText()方法有时返回空字符串,java,selenium,selenium-chromedriver,Java,Selenium,Selenium Chromedriver,我有一个奇怪的例子,selenium chrome驱动程序getText()方法(java)为某些元素返回一个空字符串,即使它为具有相同xpath的其他元素返回一个非空字符串。这是本页的一小部分 <div __gwt_cell="cell-gwt-uid-223" style="outline-style:none;"> <div>Text_1</div> <div>Text_2</div> <div>Text_3</

我有一个奇怪的例子,selenium chrome驱动程序
getText()
方法(java)为某些元素返回一个空字符串,即使它为具有相同
xpath
的其他元素返回一个非空字符串。这是本页的一小部分

<div __gwt_cell="cell-gwt-uid-223" style="outline-style:none;">
<div>Text_1</div>
<div>Text_2</div>
<div>Text_3</div>
<div>Text_4</div>
<div>Text_5</div>
<div>Text_6</div>
</div>
如下所示,这里是我正在使用的实际的
xPath
。上面的页面片段处理最后两个div

//*[@class='gwt-DialogBox']//tr[contains(@class,'data-grid-table-row')]//td[contains(@class,'lms-assignment-selection-wizard-cell')]/div/div

这不是一个解决方案,所以我不知道它是否属于一个答案,但它太长了,无法发表评论,并且包含链接,所以我把它作为一个答案

我也有这个问题。在进行一些挖掘之后,当试图获取屏幕上不可见的元素文本时,似乎出现了问题。(如上面的@Faiz注释)。如果该元素没有滚动到,或者如果您向下滚动,并且该元素靠近文档顶部,滚动后不再可见,则可能会发生这种情况。我看到您有一个FindElements()调用,它获取元素列表。至少有些可能是看不见的;您可以通过尝试
boolean b=webElement.isDisplayed()来检查这一点并检查结果。(关于这一问题的长期讨论已经进行了一年,但仍然没有解决方案。)

显然,这是一个深思熟虑的设计决策(参见);不可见元素上的gettext应该返回空。我不知道他们为什么对这件事这么坚决。已经提出了各种解决方法,包括在获取元素文本之前单击该元素或滚动到该元素。(请参见上面的链接,以获取后者的示例代码。)我不能保证这些,因为我还没有尝试过它们,但它们只是试图使元素可见,以便文本可用。不确定这对你的申请有多实际;这不是给我的。出于某种原因,FirefoxDriver没有这个问题,所以我使用的就是这个

很抱歉,我不能给你一个更好的答案-也许如果你在网站上提交一个bug报告,他们会看到很多人发现它是一个bug而不是一个功能,他们会改变功能

祝你好运! bsg

编辑

有关可能的解决方法,请参阅。如果isDisplayed返回true,您将无法完全按照给定的方式使用它,但是如果您知道是哪个元素导致了问题,或者如果文本通常不是空的,并且您可以设置“if string is empty”条件以在发生时捕获它,您仍然可以尝试它。不幸的是,这并不适用于所有人

新更新
我只是尝试了下面给出的答案,它对我有效。谢谢你,法兹

更新:大多数浏览器都支持
textContent
属性,这是一个更好的选项。这篇博文详细解释了这些差异:

或者,
innerText
属性将返回DOM中存在的元素的文本内容

element.getAttribute("innerText")
isDisplayed()
方法有时会在元素未真正隐藏但在视口之外时出错
getText()
为此类元素返回空字符串

您还可以通过使用javascript滚动到该元素,将其带入视口,如下所示:

((JavaScriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);
然后
getText()
应该返回正确的值

有关
isDisplayed()
方法的详细信息,请参见以下问题:


如果您不关心显示或滚动位置,也可以编写

String text = ((JavaScriptExecutor)driver).executeScript("return $(arguments[0]).text();", element);
或者不使用jquery

String text = ((JavaScriptExecutor)driver).executeScript("return arguments[0].innerText;", element);
getAttribute(“value”)应该可以帮助您

for(int count=0;count与
getText()相关)
我也有一个问题,因此我解决了:

for (int count=0;count<=sizeofdd;count++)
{       
   String GetInnerHTML=getddvalue.get(count).getAttribute("innerHTML");
}
WebElement errMsg;
errMsg = driver.findElement(By.xpath("//div[@id='mbr-login-error']"));
WebElement parent = driver.findElement(By.xpath("//form[@id='mbr-login-form']"));
List<WebElement> children = parent.findElements(By.tagName("div")); 
System.out.println("Size is: "+children.size());
//((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", children);
for(int i = 0;i<children.size();i++)
{
    System.out.println(i + " " + children.get(i).getText());
}
int indexErr = children.indexOf(errMsg);
System.out.println("index " + indexErr);
Assert.assertEquals(expected, children.get(indexErr).getText());
WebElement-errMsg;
errMsg=driver.findElement(By.xpath(“//div[@id='mbr-login-error']);
WebElement parent=driver.findElement(By.xpath(//form[@id='mbr-login-form']);
List children=parent.findElements(按.tagName(“div”));
System.out.println(“大小为:+children.Size());
//((JavascriptExecutor)driver.executeScript(“参数[0]。ScrollingToView(true);”,子级);

for(int i=0;i
元素。getAttribute(“innerText”)
getText()
返回空时为我工作。

我最近遇到了类似的问题

我必须检查滚动框中是否存在菜单选项卡“生活事件”。问题是有许多菜单选项卡,需要向下滚动才能看到其余的菜单选项卡。因此,我最初的解决方案对可见的菜单选项卡很有效,但对看不见的菜单选项卡无效

我使用下面的xpath将selenium指向整个滚动框的父元素

@FindBy(xpath = "//div[contains(@class, 'menu-tree')]")
protected WebElement menuTree;
然后我创建了一个WebElements列表,我可以通过它来增加。 如果菜单选项卡可见,则解决方案有效,并返回true。但如果菜单选项卡不可见,则返回false

public boolean menuTabPresent(String theMenuTab) {
    List<WebElement> menuTabs = new ArrayList<WebElement>();
    menuTabs = menuTree.findElements(By.xpath("//i/following-sibling::span"));

    for(WebElement e: menuTabs) {
        System.out.println(e.getText());
        if(e.getText().contains(theMenuTab)) {
            return true;
        }
    }
    return false;
}
解决方案1调用下面的方法。它会导致滚动框在selenium运行时向下移动

protected void scrollElementIntoView(WebElement element) {
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true)", element);
}
解决方案2获取指向的属性的文本内容(即使是当前不可见的菜单选项卡)。因此,正确地执行.getText()在这种情况下无法执行的任务。

对我有效:

添加长度大于0的字符串作为xpath谓词:

String text = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//span[string-length(text()) > 0]"))).getText();

元素在屏幕上可见还是不可见?
getText()
如果元素在视口之外,将返回一个空字符串。奇怪的是isDisplayed()为该元素返回true,但getText()为返回一个空字符串。同样奇怪的是,Mac上的chrome驱动程序的结果与windows上的chrome驱动程序的结果总是不正确。不过感谢您的评论,感谢您花时间。这很有趣。实际上,我在phantomjs驱动程序上又遇到了这个问题。很好。getAttribute(“innerText”)技巧奏效了。非常有趣的是,对于给定的元素(例如“Text_2”),isDis是
protected void scrollElementIntoView(WebElement element) {
    ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true)", element);
}
String text = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//span[string-length(text()) > 0]"))).getText();