Недавно я сделал несколько исправлений ошибок в тестировании Selenium (в основном пытаясь решить проблемы, с которыми столкнулись инженеры по контролю качества). Одной из проблем была попытка определить эффективный цвет фона div.
Давайте посмотрим на этот пример HTML
...DEV.TO
Моя цель состояла в том, чтобы получить цвет фона #myDiv
.
Очевидным решением, которое я попробовал, было получение цвета фона свойства css из этого элемента.
WebElement element = driver.findElement(By.cssSelector("#myDiv")); element.getCssValue("background-color");
Это заводит меня rgba(0, 0, 0, 0)
вместо ожидаемого черного.
Я немного погуглил и нашел решение, которое должно вычислять эффективное свойство с помощью JavaScript. Это выглядело так.
WebElement elemement = driver.findElement(By.cssSelector("#myDiv")); String computedStylePropertyScript = "return window.document.defaultView" + ".getComputedStyle(arguments[0],null).getPropertyValue(arguments[1]);"; ((JavascriptExecutor) driver).executeScript(computedStylePropertyScript, elem, "background-color");
Все еще получает rgba(0, 0, 0, 0)
.
Это почему?
Я погуглил намного больше и обнаружил, что современные браузеры обрабатывают rgba(0, 0, 0, 0)
как прозрачный цвет и будет отмечен как эффективный.
Нехорошо для меня. Итак, мои решения должны заключаться в том, чтобы зайти, найти родительский раздел и проверить его цвет. Если она все еще прозрачна, идите глубже. Чтобы сделать этот цикл не бесконечным, давайте закончим на теге body. Если до этого мы не найдем никакого цвета, то, вероятно, цвет не указан.
Мой код выглядит так.
private String getBGColor(WebElement elementToSearch) { WebElement current = elementToSearch; while(isTransparent(current.getCssValue("background-color"))) { if (current.getTagName().equals("body")) { return null; } // Find Parent current = current.findElement(By.xpath("./..")); } return current.getCssValue("background-color"); } private boolean isTransparent(String color) { String colorMod = color.replaceAll("\\s+","").toLowerCase(); return Arrays.asList("transparent","","rgba(0,0,0,0)").contains(colorMod); }
Вы можете назвать это так.
WebElement element = driver.findElement(By.cssSelector("#myDiv")); getBGColor(element);
И это работает, это дает вам правильный черный цвет.
Но. Всегда есть какие-то “но”. Это наивная реализация, если у вас есть абсолютно позиционированные элементы (ваш элемент не отображается в родительском div), это приведет к сбою.
Если вам это интересно, вы можете подписаться на меня на Твиттер .
Оригинал: “https://dev.to/pavel_polivka/determining-the-effective-background-color-17ld”