2015-11-26 67 views
2

我想检查使用Selenium(Python如果有问题)在HTML页面上的某些文本(如“独角兽”)是否可见。检查文本是否在HTML元素的页面上可见

然而,对于不相关的原因的页面具有以下结构(简化):

<div> 
    <span style="display: none">A</span> <span style="display: none">unicorn</span> 
</div> 

Lettuce WebdriverAloe Webdriver使用的检查是:

driver.find_elements_by_xpath(
    '//*[contains(normalize-space(.),"{content}")'.format(text)) 

,然后检查is_displayed返回的元件。但是,这将找到外部div元素,并且其文本将包含搜索的字符串,即使该字符串实际上对用户不可见。

如何检查页面上的某些文字是可见即使它跨越多个元素?

各自的错误:Aloe Webdriver bugLettuce Webdriver bug

+0

你可以使用美丽的可能...看到这个答案:http://stackoverflow.com/a/27115266/499581 –

+0

这需要我重新实现一个CSS分析器,因为实际的网页可能会使用类而不是简单的'显示:无'。 – Koterpillar

回答

0

这是一个困难的情况。对于你给出的具体例子,下面的代码应该可以工作。代码基本上将“独角兽”分成两个单词并找出各个元素。找到各个跨度标签后,找到每个元素的父项并进行比较以获得相等性。如果父母相等,则每个单独的元素用于显示属性。

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; 
     } 
    } 
} 

为了使这种情况通用很多努力和许多条件将不得不合并。快乐编码!

+0

谢谢你的回答。类似这样的事情是我为解决我眼前的问题而做的,但我认为它不适用于一般情况。 – Koterpillar

相关问题