Selenium - 确定透明HTML对象的背景颜色

时间:2012-07-10 12:43:24

标签: html selenium webdriver background-color

我想计算具有特定背景颜色的字符数。要意识到我使用此解决方案遍历所有HTML节点:Counting inner text letters of HTML element

Html页面:

  <span style="background-color: #ffff00;">
    <span id="child">I inherit the background color but Selenium gives me back transparent</span>
  </span>

硒示例:

FirefoxDriver firefoxDriver = new FirefoxDriver();
// firefoxDriver.get(...);

WebElement element = firefoxDriver.findElement(By.id("child"));
final String cssValue = element.getCssValue("background-color");

System.out.println("TextColor of the Child Element: " + cssValue);

现在的问题是,System.out将“透明”打印为css值,而不是#ffff00作为背景色。

在这种情况下,我现在需要一些代码来查找父级的值。如果父母也有“透明”作为价值,那么它应该继续这样。

我正在使用java 7,但可以按Selenium执行JavaScript代码。

1 个答案:

答案 0 :(得分:0)

在CSS值中,默认情况下并不总是继承。在您的情况下,内部跨度不会继承背景颜色,除非您具体说明它。

我做了两个jsFiddles来证明这一点:

没有继承: http://jsfiddle.net/vLXfr/

使用Inherit: http://jsfiddle.net/B67Bm/

正如您所看到的,如果您告诉子元素继承背景颜色,则返回的值仅与父项背景颜色相同。

更新:

查看了您添加的来源后,您需要回答几个问题,但这是可能的。

这是一个丑陋的算法,我面前没有硒,所以你必须检查默认值。基本思想是在DOM中查看parent / grandparent / greatgrandparent,直到找到具有颜色集的父元素并将其返回。

public String getParentBackgroundColor(WebElement element) {
    WebElement current = element;
    //Ugly while true loop, fix this
    while(true) {
        //Get the current elements parent
        WebElement parent = element.findElement(By.xpath("..")); 

        //If the parent is null then doesn't have a parent so we should stop (change to seleniums default if element doesn't have a parent)
        if (parent == null) {
            throw new WeFailedException("Sorry, no parent elements had a background-color set");
        } else {
            //Otherwise get the parents color
            String color = parent.getCssValue("background-color");
            //If the color is transparent (based off your description, this could be some other default value) then set the parent as the current and continue the loop to try and get the parents parents color
            if (color == "transparent") {
                current = parent;
            } else {
                //If we found a color return it
                return color;
            }
        }
    }
}

然后你可以使用它并将你的内部跨度传递给它,它应该返回父颜色。

希望这有帮助。