java - 无法从已确认存在的 WebElement 获取innerHTML

标签 java selenium

我正在尝试使用 Selenium WebDriver 从此 HTML 获取innerHTML 值。

<div class="map-overlay-network">Newham : NSG Designated Streets (Type 1/2)</div>

这段代码应该确认该元素是否存在:

public boolean isMapOverlayNetworkPresent() {

    By byExpression = By.className(mapOverlayNetworkClassName);
    return isWebElementPresent(byExpression);

}

我的元素定义在类的顶部:

private static final String mapOverlayNetworkClassName = "map-overlay-network";
@FindBy(className=mapOverlayNetworkClassName) private WebElement mapOverlayNetwork;

这是函数 isMapOverlayNetworkPresent 的代码:

public boolean isWebElementPresent(By byExpression) {

    WebDriverWait wait = new WebDriverWait(driver, 60);
    try { 
        wait.until(ExpectedConditions.presenceOfElementLocated(byExpression));
        return true;

    } catch (TimeoutException e) {

        System.out.println("Timeout waiting for presence of element " + byExpression);
        return false;

    }

}

这是我尝试获取innerHTML的地方:

public String returnDefaultNetwork() {

    String defaultNetwork = mapOverlayNetwork.getAttribute("innerHTML");
    System.out.println("Default network = " + defaultNetwork);
    return defaultNetwork;

}

这是来 self 的控制台的报告:

Is default network shown on map: true
Default network = 

如果我在 Firefox 中加载页面并使用开发人员工具,我可以使用检查器查看该元素。如果我右键单击检查器中的元素并选择复制 InnerHTML,我会得到以下值:

纽汉姆:NSG 指定街道(类型 1/2)

这就是我想要的值。

这不适用于我正在测试的任何浏览器,即 Firefox、Chrome 或 Edge。

有什么建议吗?

屏幕上的前一个元素工作正常。这是它在 HTML 中的样子:

<div class="map-overlay-customer">Newham</div>

这就是它在我的 PageObject 类中的定义方式:

public static final String mapOverlayCustomerClassName = "map-overlay-customer";
@FindBy(className=mapOverlayCustomerClassName) private WebElement mapOverlayCustomer;

这是我返回的 InnerHTML:

public String returnDefaultCustomer() {

    return mapOverlayCustomer.getAttribute("innerHTML");

}

这是控制台的响应:

Default customer: Newham

更新2017年12月21日

按照下面的建议,我在检测到元素的存在后添加了等待可见性。

private void waitForVisibility(WebElement element) throws Error {

    // time out in seconds
    try {

         new WebDriverWait(driver, 60).until(ExpectedConditions.visibilityOf(element));

    } catch (TimeoutException e) {

         System.out.println("Timeout waiting for presence of element " + element);

    }

}

public boolean isMapOverlayNetworkVisible() {

    waitForVisibility(mapOverlayNetwork);
    return mapOverlayNetwork.isDisplayed();

}

在我的测试课中:

reportAssert("Is default network present on map", alloyLoggedInPage.isMapOverlayNetworkPresent());

reportAssert("Is default network visible on map", alloyLoggedInPage.isMapOverlayNetworkVisible());

System.out.println("Default network: " + alloyLoggedInPage.returnDefaultNetwork());

我的结果:

Is default network present on map: true
Is default network visible on map: true
Get default network.
Default network = Newham : NSG Designated Streets (Type 1/2)
Default network: Newham : NSG Designated Streets (Type 1/2)

最佳答案

尝试使用.getAttribute("value").getText()为您的网络元素。

PS:但是很奇怪的是.getAttribute("innerHTML")不起作用。

PSS:还可以尝试通过运行JavaScript来检查浏览器控制台中元素的值:

document.querySelector(".map-overlay-network").innerHTML;

PSSS:另外,我想建议再添加一个等待 ExpectedConditions.visibilityOfElementLocated(By.id<locator>‌​)在你等待之后,因为你的等待元素只是在 DOM 中,但不可见。

关于java - 无法从已确认存在的 WebElement 获取innerHTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47910627/

相关文章:

java - Android 比较两个微调器和新 Activity 的 Intent

java - 为什么在Spring中使用服务实现模式

c# - 如何在 Selenium C# 中使用现有的 Firefox 配置文件?

java - 如何在 Selenium Webdriver 中使用 "Upload Image Button"上传文件/照片

java - 处理 Selenium 抛出的错误

java - 如何在 Apache Chemistry CMIS API 中设置字符集?

java - 如何重现代码规范中提到的多线程错误?(TSM03-J。不要发布部分初始化的对象)

java - 如何在工作空间中永久添加 Selenium Firefox 配置文件

java - 在 Selenium 中以隐身模式运行 chrome 浏览器

java - 与 Selenium 交互到 Google Translate 网站时启用 javascript 失败