我想得到li(second)元素的文本如下。代码能够找到元素但是在获取gettext时抛出错误。请帮忙。
WebElement element = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul/li[2]"));
element.getText();
错误
陈旧元素引用:元素未附加到页面文档
HTML
<div id=location_group>
<div>
<ul class="og-tooltip js-og-tooltip" style="display: none; opacity: 100;">
<li class="title_text">Organization Group</li>
<li class="value_text" style="background: rgb(204, 136, 136); border: 2px solid red;">Global / Aricent / gemsecure </li>
<li> </li>
<li class="title_text">Group ID</li>
<li class="value_text">gemsecure</li>
</ul>
</div>
</div>
答案 0 :(得分:0)
我建议您使用xPath。我想我已经尝试了Java硒库中的每个解决方案,因此我的网站上有棘手的选择-一旦用户选择了一个选项,就会重新加载这些选项(例如,选定的值有时会消失,有时加载的不同选项取决于特定的选择)。 许多过时的元素异常。 我用过的:
private WebElement getDesiredOptionByVisibleText(WebDriver driver, String selectId, String text) {
List<WebElement> options = driver.findElements(By.xpath("//select[@id='" + selectId
+ "']/option[contains(text(),'" + text + "')]"));
if (options == null || options.size() == 0) {
return null;
} else {
return options.get(0);
}
}
尤其是在等待时使用此方法,例如我的等待:
private void waitUntilDesiredOptionVisible(WebDriver driver, String selectId) {
getFluentWait(driver).until(d -> (getDesiredOptionByVisibleText(driver, selectId, value) != null));
}
public static FluentWait<WebDriver> getFluentWait(WebDriver driver) {
return new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(60))
.pollingEvery(Duration.ofMillis(100));
}
最后但并非最不重要的一点是点击该选项。
private void selectByVisibleTextRegex(WebDriver driver, String selectId) {
WebElement option = getDesiredOptionByVisibleText(driver, selectId, value);
if (option == null) {
throw new NoSuchElementException(String.format("Cannot locate element with text like: %s.", value));
}
option.click();
}
答案 1 :(得分:-1)
因为这个元素用一个带有display的ul包装:none selenium不能与它交互。 尝试的选项:
element.getAttribute("innerHTML");
或者您可以使用 JavascriptExecutor :
JavascriptExecutor executor = (JavascriptExecutor)driver;
String text= executor.executeScript("document.document.getElementsByClassName('value_text')[0].innerHTML");
另一个选择是使用querySelector / querySelectorAll,它比getElementsByClassName
答案 2 :(得分:-1)
可能你必须等待父元素可见然后与它交互
WebElement elementUL = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul"));
WebDriverWait wait=new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOf(elementUL));
WebElement element = driver.findElement(By.xpath("//div[contains(@id,'location_group')]/div/ul/li[2]"));
element.getText();
答案 3 :(得分:-1)
放置明确的等待WebDriverWait
并等待元素可见
WebElement ele = driver.findElement(By.xpath("Your locator "));
WebDriverWait wait=new WebDriverWait(driver, 25);
wait.until(ExpectedConditions.visibilityOf(ele));
然后getText()