Selenium + C#: Создание скриншотов + Подсвечивание элементов

screenshot
Теги: #<Tag:0x00007fedc03f5678>

(Hathi) #1

Доброго времени суток. Столкнулся с такой проблемой. Необходимо Сделать скриншот страницы + подсветить элемент .Как делать я знаю(делал когда-то так):

      public static void HighlightElement(String screenshotName, IWebElement Element)
        {
            IJavaScriptExecutor js = (IJavaScriptExecutor)Driver();
            String bgcolor = Element.GetCssValue("backgroundColor");
            js.ExecuteScript("arguments[0].style.backgroundColor = '" + "red" + "'", Element);
            SaveScreenshotWithHighlightedElement(screenshotName);
            js.ExecuteScript("arguments[0].style.backgroundColor = '" + bgcolor + "'", Element);
         }


        public static void SaveScreenshotWithHighlightedElement(string filename)
        {
            Screenshot ss = ((ITakesScreenshot)Driver()).GetScreenshot();
            ss.SaveAsFile(filename, System.Drawing.Imaging.ImageFormat.Png);
        }


Но теперь концепция поменялась.

Дапупустим есть страница гугла для авторизации

class Authentication
    {
        public IWebDriver Driver()
        {
            return WebBrowser.GetInstance();
        }

        public IWebElement Account()
        {
            return Driver().FindElement(By.XPath("//*[@id='Email']"));
        }

        private IWebElement Password()
        {
            return Driver().FindElement(By.XPath("//*[@id='Passwd']"));
        }

        private IWebElement SignInButton()
        {
            return Driver().FindElement(By.XPath("//*[@id='signIn']"));
        }

        private IWebElement SignOutButton()
        {
            return Driver().FindElement(By.Id("gb_71"));
        }
        public IWebElement ProfileButton()
        {
            return Driver().FindElement(By.Id("gbg4"));
        }
        
        public void Open()
        {
            Open("https://accounts.google.com");
        }

        public void Open(string url)
        {
            Driver().Navigate().GoToUrl(url);
        }

        public void SignIn(string login, string password)
        {
            Open();
            Account().SendKeys(login);
            Password().SendKeys(password);
            SignInButton().Click();
           
        }

        public void SignOut()
        {
           ProfileButton().Click();
            SignOutButton().Click();
        }
    }

И как реализовать хайлайт элементов в рамках данной архитектуры у меня в голову не ложиться. Как мне кажется вызывать в кажом методе сделать скриншот это глупо.

Есть ли у кого идеи?


(Mykhailo Poliarush) #2

ну я бы вам порекомендовал использовать прослушивание событий через org.openqa.selenium.support.events.WebDriverEventListener

я когда-то уже об этом писал тут http://automated-testing.info/forum/kak-sdelat-class-listener-dlya-webdriver-deystviy#comment-2270


(apetrovskiy) #3

Не могу сказать про ваш код, как организовать это тут, в http://SePSX.CodePlex.com подсвечивание сделано по выходе из командлеты, в WriteObject. Поскольку в пауэршелл всё организовано как поток выполнения (пайплайн).

Если элемент нашёлся (и разрешено подсвечивание), то подсвечивается.

Скриншоты работают по-другому: если задана установка "снимать скриншот при ошибке", то скриншоты снимаются автоматически с экрана (например, не найден элемент - снять скриншот с элемента было бы невозможно, а снять скриншот с области без элемента как-то бессмысленно).

Можно снять и вручную: штатной командлетой Save-UIAScreenshot -Description "description".