isDisplayed始终为特定元素

时间:2015-12-15 08:13:32

标签: java selenium

我使用Selenium检查用户发送带空字段的表单时是否显示错误消息。错误消息块始终附加到DOM,但是当没有错误时,它具有" display:none;"样式属性。所以,当我推动" save"按钮,我检查这个块是否可见:

Assert.assertTrue("There is no validation error!", driver.findElement(By.id("validationModal")).isDisplayed());

这很有效。但是,当我试图检查此块中的消息是否显示时,isDisplayed方法总是返回" false"。当我使用这个时:

driver.findElement(By.id("validationModal")).findElement(By.tagName("ul"))
            .findElement(By.xpath("//*[contains(text(),'Empty app name field')]"));

它很好,但它错了,因为当这个文本不可见时它不会抛出异常,但会在页面代码中。如果我写这个:

Assert.assertTrue(driver.findElement(By.id("validationModal")).findElement(By.tagName("ul"))
            .findElement(By.xpath("//*[contains(text(),'Empty app name field')]")).isDisplayed());

总是失败。我并不真正理解为什么以及如何检查,错误消息的文本以正确的方式显示。

UPD: 我找到了问题的根源。这个字符串找不到里面的元素" validationModal"阻止,但内部标记,其中包含我们必须找到的文本。

driver.findElement(By.id("validationModal")).findElement(By.tagName("ul"))
                .findElement(By.xpath("//*[contains(text(),'Empty app name field')]")).isDisplayed()

但是我仍然不明白为什么会这样,因为我指定了应该搜索它的元素。

3 个答案:

答案 0 :(得分:0)

您似乎正在尝试与某个模态框架进行交互。

通常,要与模态元素进行交互,您应首先更改驱动程序上下文。

driver.switchTo().frame("ModelFrameTitle");

driver.switchTo().activeElement()

查找或检查元素,然后返回主框架

driver.switchTo().defaultContent()

答案 1 :(得分:0)

试试这个:

 Assert.assertTrue("Element is not displayed",driver.findElement(By.xpath("//*[contains(text(),'Empty app name field')]")).isDisplayed());

答案 2 :(得分:0)

xpath中有错误。

错误的字符串是:

findElement(By.xpath("//*[contains(text(),'Empty app name field')]"))

正确的是:

findElement(By.xpath("//li[contains(text(),'Empty app name field')]")