我想使用Selenium(Python,如果重要的话)检查HTML页面上的某些文本(例如"独角兽")是否可见。
但是,由于无关的原因,该页面具有以下结构(简化):
<div>
<span style="display: none">A</span> <span style="display: none">unicorn</span>
</div>
Lettuce Webdriver和Aloe Webdriver中使用的检查是:
driver.find_elements_by_xpath(
'//*[contains(normalize-space(.),"{content}")'.format(text))
然后检查is_displayed
的返回元素。但是,这将找到外部div
元素,并且其文本将包含搜索的字符串,即使该字符串实际上对用户不可见。
如何查看页面上的某些文字可见,即使它跨越多个元素?
答案 0 :(得分:0)
这是一个困难的场景。对于您给出的具体示例,以下代码应该有效。代码基本上将“A独角兽”分成2个单词并找到各个元素。找到各个span标签后,找到每个元素的父元素并进行相等性比较。如果父级是相等的,则每个单独的元素都用于显示属性。
public class ComplicatedSearch {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("url");
// Look if "A unicorn" occurs within a single element
WebElement element = getElement(driver, "A unicorn");
if (element != null) {
if (element.isDisplayed()) {
System.out.println("Text is displayed");
}
}
// Split "A unicorn" into 2 String and find the individual elements
WebElement part1 = getElement(driver, "A");
WebElement part2 = getElement(driver, "unicorn");
if (part1 != null && part2 != null) {
// find the parents of part1 and part2 and compare whether they are
// equal
if (findParent(driver, "A").equals(findParent(driver, "unicorn"))) {
// if parents are equal, check if both elements are displayed
if (part1.isDisplayed() && part2.isDisplayed()) {
System.out.println("Text is displayed");
} else {
System.out.println("Text is not displyed");
}
}
}
}
private static WebElement getElement(WebDriver driver, String keyword) {
try {
return driver.findElement(By.xpath("//*[.='" + keyword + "']"));
} catch (NoSuchElementException e) {
return null;
}
}
private static WebElement findParent(WebDriver driver, String keyword) {
try {
return driver.findElement(By.xpath("//*[.='" + keyword + "']/.."));
} catch (NoSuchElementException e) {
return null;
}
}
}
为了使这个场景具有通用性,需要投入大量精力和许多条件。快乐的编码!!