Как преобразовать и сопоставить цвет фона RGB (255, 255, 255) с #fff, используя Selenium TestNG и Java - PullRequest
0 голосов
/ 19 февраля 2019

В моем автоматическом коде я пытаюсь подобрать цвет фона веб-элемента «Найди лучшую карту для меня».

Вид консоли:

enter image description here

Для этого мне нужно идентифицировать этот веб-элемент на страницево-первых, получите цвет, сохраните в String как ожидаемое значение.

Ниже код делает то же самое:

WebElement slickDotButton2Presence = driver.findElement(homepageobjectsloc.slickDotButton2);
slickDotButton2Presence.click();
String findTheBestCarsForMeTextBackgroundColour = driver.findElement(homepageobjectsloc.secondBannerFindTheBestCardForMeText).getCssValue("background");

В веб-сайте значение в шестнадцатеричном формате, но метод Selenium будет возвращать значения в rgb. Поэтому любое значение, полученное из строки кода выше, необходимо преобразовать вСначала в шестнадцатеричном виде, а затем нужно сравнить с методом assert.

Используется ниже строка кода:

try {
    String value = findTheBestCarsForMeTextBackgroundColour.trim();
    String[] rgbs = value.split("\\)")[0].split("\\(")[1].split(",");
    long r = Long.parseLong(rgbs[0]);
    long g = Long.parseLong(rgbs[1]);
    long b = Long.parseLong(rgbs[2]);
    String hex = String.format("#%02x%02x", r, g, b);
    System.out.println("=> The hex conversion is : " + hex);
    Assert.assertEquals("#fff", hex);
}

Но когда я его выполняю, появляется ошибка ниже:

=> The hex conversion is : #ffff
java.lang.AssertionError: expected [#ffff] but found [#fff]
    at org.testng.Assert.fail(Assert.java:94)
    at org.testng.Assert.failNotEquals(Assert.java:513)
    at org.testng.Assert.assertEqualsImpl(Assert.java:135)
    at org.testng.Assert.assertEquals(Assert.java:116)
    at org.testng.Assert.assertEquals(Assert.java:190)
    at org.testng.Assert.assertEquals(Assert.java:200)
    at tests.homepage.HomePageStepDefinitions.verify_that_Find_the_best_card_for_me_text_is_available_on_the_second_banner_in_hompage_then_click_on_it(HomePageStepDefinitions.java:795)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at cucumber.runtime.Utils$1.call(Utils.java:40)
    at cucumber.runtime.Timeout.timeout(Timeout.java:16)
    at cucumber.runtime.Utils.invoke(Utils.java:34)
    at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.java:38)
    at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java:37)
    at cucumber.runtime.Runtime.runStep(Runtime.java:300)
    at cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44)
    at cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39)
    at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:44)
    at cucumber.runtime.model.CucumberFeature.run(CucumberFeature.java:165)
    at cucumber.api.testng.TestNGCucumberRunner.runCucumber(TestNGCucumberRunner.java:63)
    at cucumber.api.testng.AbstractTestNGCucumberTests.feature(AbstractTestNGCucumberTests.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:86)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:643)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:820)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1128)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
    at org.testng.TestRunner.privateRun(TestRunner.java:782)
    at org.testng.TestRunner.run(TestRunner.java:632)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:366)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:361)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:319)
    at org.testng.SuiteRunner.run(SuiteRunner.java:268)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1244)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1169)
    at org.testng.TestNG.run(TestNG.java:1064)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:114)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

Как конвертировать в гекс и пройти тест?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Из ваших испытаний кода, по-видимому, вы получаете:

  • r -> 255
  • g -> 255
  • b -> 255

Вид консоли

Согласно виду консоли, который вы видите:#fff.@DanHerbert в этом обсуждении упоминает, что это компрессоры, которые будут интеллектуально преобразовывать #ffffff в #fff для оптимизации скорости загрузки страницы как сетевая задержка , пропускная способность и время разбора в целом важнее, чем время обработки.

Чтобы справиться с этими случаями, @TJCrowder в thisВ обсуждении предлагается найти строку, начинающуюся с #, за которой следуют три пары совпадающих шестнадцатеричных цифр, и заменить их только краткой формой, прежде чем вы рассмотрите утверждение следующим образом:

static String getHex(int r, int g, int b) {
    return String.format("#%02x%02x%02x", r, g, b).replaceAll("^#([a-fA-F])\\1([a-fA-F])\\2([a-fA-F])\\3$", "#$1$2$3");
}

Примерреализация:

  • Кодовый блок:

    package demo;
    
    public class Background_White {
    
        public static void main(String[] args) {
    
            System.out.println(getHex(255, 255, 255)); // #fff
        }
    
        static String getHex(int r, int g, int b) {
            return String.format("#%02x%02x%02x", r, g, b).replaceAll("^#([a-fA-F])\\1([a-fA-F])\\2([a-fA-F])\\3$", "#$1$2$3");
        }
    }
    
  • Консольный вывод:

    #fff
    

В вашем случае вы можете использовать его как:

try {
    String value = findTheBestCarsForMeTextBackgroundColour.trim();
    String[] rgbs = value.split("\\)")[0].split("\\(")[1].split(",");
    long r = Long.parseLong(rgbs[0]);
    long g = Long.parseLong(rgbs[1]);
    long b = Long.parseLong(rgbs[2]);
    String hex = String.format("#%02x%02x%02x", r, g, b).replaceAll("^#([a-fA-F])\\1([a-fA-F])\\2([a-fA-F])\\3$", "#$1$2$3");
    System.out.println("=> The hex conversion is : " + hex);
    Assert.assertEquals("#fff", hex);
}
0 голосов
/ 19 февраля 2019

Попробуйте библиотеку селена

import org.openqa.selenium.support.Color;
String value = findTheBestCarsForMeTextBackgroundColour.trim();
String hex = Color.fromString(value).asHex();
System.out.println("=> The hex conversion is : " + hex);
Assert.assertEquals("#fff", hex);

С официальной документацией по селену можно ознакомиться здесь

Ниже приведен тестовый пример в тестах селена на джунит, написанный для вашего случая.Убедитесь, что строка rgb, которую вы передаете в Color.fromString("rgbString"), должна иметь формат, ожидаемый функцией.

  @Test
  public void rgbToHex() {
    String hex = "#01ff03";
    String rgb = "rgb(1, 255, 3)";
    assertThat(Color.fromString(rgb).asHex()).isEqualTo(hex);
  }
...