Selenium WebDriver getText

3

我有一个<div name="myDiv">0</div>

我试着编写一个测试,检查myDiv里面的文本是否为0。使用WebDriver,代码如下:

String text = webDriver.findElement(By.xpath("//div[@name='myDiv']")).getText();

但是结果中我得到的是一个空字符串。难道我不应该使用getText()方法来获取div标签的内容吗?


8个回答

2
我遇到了同样的问题,后来找到了这个解决方法:
HTMLUnitDriver(以及显然FirefoxDriver)在你试图调用CSS属性“display”设置为“none”的元素的WebElement#getText()时会返回空字符串。
以下是我的解决方案:
public void assertContainsText(final By by, final String value) { 
    browser.waitTillElementPresent(by);
        Boolean result = new WebDriverWait(getWebDriver(),Browser.DEFAULT_WAIT_TIMEOUT_SECONDS).until(new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(WebDriver arg0) {
                WebElement elem = arg0.findElement(by);
                String text = "";
                if (elem.isDisplayed()) {
                    text = elem.getText();
                } else {
                  //have to use JavaScript because HtmlUnit will return empty string for a hidden element's text
                    text = (String) executeScript("return arguments[0].innerHTML", elem);
                    text = text.replace("<BR></BR>", "\n"); //scary
                }
                return text.contains(value);
            }
        });
        Assert.assertTrue(by.toString() + " contains value ["+value+"]", result);
}

是的,这看起来很丑陋。请注意文本.replace("<BR></BR>") - 这是因为在提取原始数据时未转义HTML标记。如果您在元素上调用#getText(),WebDriver会很好地'取消转义'。

我已向我们的IT人员提出请求,在我们的CI服务器上安装X-Windows,以便我们可以运行FirefoxDriver。我们从HTMLUnitDriver那里遇到了无尽的麻烦,而且启动速度非常慢。


1
你可以尝试使用 jsoup 库来解析 HTML。
首先将页面内容(driver.getPageSource())加载到 jsoup 文档对象中,然后使用该优秀库的丰富方法(向作者致敬)。
示例:
String pageSource = driver.getPageSource();
Document doc = Jsoup.parse(pageSource);
Elements requestsListRecords = doc.getElementsByTag("table").get(2).getElementsByTag("tr");

1

我只需要为我的 webDriver 使用一个真正的浏览器:

webDriver = new FirefoxDriver();

然后它就可以工作了。

可能是JavaScript的问题。


虽然使用Chrome或Firefox驱动程序可以工作,但您知道为什么HtmlUnitDriver不行吗? - Khanetor

1

听起来你正在使用HTMLUnitDriver。在这种情况下,你需要像下面这样启用JavaScript代码。

HtmlUnitDriver driver = new HtmlUnitDriver();
driver.setJavascriptEnabled(true);

请查看此处的文档。


是的,你说得对,但它不起作用,我使用Qquery fadeIn()来处理该元素 - 但即使设置了setJavascriptEnabled(true)和wait(xxxx),它也不起作用...所以我更喜欢使用真正的浏览器。 - ses

1
在Selenium 2中,我使用了这个方法,它对我来说很有效。
driver.getPageSource().contains(text);

1
你可以使用getText(),即使它没有任何内容。这不应该是问题。
从你的回答中,问题似乎在于你没有实例化FirefoxDriver。
Selenium WebDriver只与可见元素交互,因此不可见元素的文本始终返回为空字符串。

0

你也可以通过以下方式验证 div 中的文本:

$browser.is_element_present("//div[@name='myDiv']/.[text()='0']")

0

试试这个

WebDriver driver = new YourBrowserdirver(); //FirefoxDriver or ChromeDriver etc..
String Text = driver.findElement(By.id("myDiv")).getText();
System.out.println("The text present in myDiv = "+Text);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接