2

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

网页:

  <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 代码。

4

1 回答 1

0

默认情况下,CSS 值并不总是继承。在您的情况下,除非您明确告诉它,否则内部跨度不会继承背景颜色。

我已经完成了两个 jsFiddles 来证明这一点:

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

带继承:http: //jsfiddle.net/B67Bm/

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

更新:

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

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

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

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

希望这可以帮助。

于 2012-07-10T13:53:57.283 回答