我正在尝试使用 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/