Тесты Selenium Webdriver всегда терпят неудачу на Azure DevOps, но отлично работают на компьютере разработчика - PullRequest
0 голосов
/ 06 марта 2020

Используя тестовый проект. net core 3.1 XUnit и привязки C# для Selenium WebDriver API, мои тесты проходят успешно, когда я запускаю их локально на моей машине разработки, но всегда не выполняются при запуске в выпуске Azure DevOps pipe.

Вот определение Yaml для тестового задания

steps:
- task: VSTest@2
  displayName: 'VsTest - testAssemblies'
  inputs:
    testAssemblyVer2: '**\--REDACTED--.dll'
    uiTests: true
    runInParallel: false
    rerunFailedTests: true

Я следовал рекомендациям Microsoft и активировал uiTest, а runInParallel равен false в определении конвейера , Я также пытался запускать тесты с каждой возможной перестановкой этих двух

Версия ChromeDriver 80.0.3987.106, которая является предустановленной на агенте, который я использую. Я использую двоичные файлы ChromeDriver, предварительно установленные на агенте, с помощью переменной среды ChromeWebDriver (ее значение равно C:\\SeleniumWebDrivers\\ChromeDriver). Я пытался использовать windows-2019 и vs2017-win2016 агентов. Это ничего не изменило.

Веб-драйвер работает в автономном режиме.

Вот соответствующий пример вывода из Azure конвейера DevOps. Я считаю, что тест на самом деле не дает сбоя, потому что элемент не может быть найден (так как тесты постоянно работают локально), а не потому, что сам драйвер не работает.

[...]
2020-03-06T14:38:02.2076961Z Starting ChromeDriver 80.0.3987.106 (f68069574609230cf9b635cd784cfb1bf81bb53a-refs/branch-heads/3987@{#882}) on port 49976
2020-03-06T14:38:02.2078676Z Only local connections are allowed.
2020-03-06T14:38:02.2079642Z Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
2020-03-06T14:38:28.0289610Z [xUnit.net 00:00:31.64]       OpenQA.Selenium.NoSuchElementException : no such element: Unable to locate element: {"method":"css selector","selector":"#autocomplete"}
2020-03-06T14:38:28.0296747Z   (Session info: headless chrome=80.0.3987.122)
2020-03-06T14:38:28.0297355Z [xUnit.net 00:00:31.64]       Stack Trace:
2020-03-06T14:38:28.0328125Z ##[error][xUnit.net 00:00:31.64]     --REDACTED--Test.ArticleSearchTest.SearchJuraSaturdaySaturdayWithoutDatesAndNoOsmSelectionResultIsPageUfi [FAIL]
2020-03-06T14:38:28.0338184Z [xUnit.net 00:00:31.64]            at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
2020-03-06T14:38:28.0339005Z [xUnit.net 00:00:31.64]            at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
2020-03-06T14:38:28.0339833Z [xUnit.net 00:00:31.64]            at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
2020-03-06T14:38:28.0340530Z [xUnit.net 00:00:31.64]            at OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById(String id)
2020-03-06T14:38:28.0341218Z [xUnit.net 00:00:31.64]            at OpenQA.Selenium.By.<>c__DisplayClass16_0.<Id>b__0(ISearchContext context)
2020-03-06T14:38:28.0341907Z [xUnit.net 00:00:31.64]            at OpenQA.Selenium.By.FindElement(ISearchContext context)
2020-03-06T14:38:28.0342538Z [xUnit.net 00:00:31.64]            at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by)
2020-03-06T14:38:28.0343418Z [xUnit.net 00:00:31.64]         C:\agent\_work\25\s\Tests\--REDACTED--Test\SeleniumSearchUtils.cs(16,0): at --REDACTED--Test.SeleniumSearchUtils.SetDestinationToJuraWithoutSelectingDestinationInDropdown(IWebDriver driver)
2020-03-06T14:38:28.0344566Z [xUnit.net 00:00:31.64]         C:\agent\_work\25\s\Tests\--REDACTED--Test\Tests\ArticleSearchTest.cs(118,0): at --REDACTED--Test.ArticleSearchTest.SearchJuraSaturdaySaturdayWithoutDatesAndNoOsmSelectionResultIsPageUfi()
2020-03-06T14:38:28.0345417Z [xUnit.net 00:00:31.65]       Output:
2020-03-06T14:38:28.0346024Z [xUnit.net 00:00:31.65]         Selenium target url: http://test.--REDACTED--.com/de/frankreich/camping-bretagne
2020-03-06T14:38:28.0375453Z [xUnit.net 00:00:31.65]   Finished:    --REDACTED--Test
[...]

По совету Грега я увеличено допустимое время ожидания, прежде чем будет сгенерировано исключение не найденного элемента. Я установил его на 120 секунд, что привело к ошибке тайм-аута. Соответствующая трассировка стека

   ---- System.Net.WebException : The operation has timed out.
2020-03-06T15:39:37.4581244Z [xUnit.net 00:02:24.81]       Stack Trace:
2020-03-06T15:39:37.4582083Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo requestInfo)
2020-03-06T15:39:37.4582955Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute)
2020-03-06T15:39:37.4583816Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(Command commandToExecute)
2020-03-06T15:39:37.4584863Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
2020-03-06T15:39:37.4585662Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
2020-03-06T15:39:37.4586387Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById(String id)
2020-03-06T15:39:37.4587146Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.By.<>c__DisplayClass16_0.<Id>b__0(ISearchContext context)
2020-03-06T15:39:37.4587838Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.By.FindElement(ISearchContext context)
2020-03-06T15:39:37.4588507Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by)
2020-03-06T15:39:37.4589490Z [xUnit.net 00:02:24.81]         C:\agent\_work\25\s\Tests\--REDACTED--Test\SeleniumSearchUtils.cs(16,0): at --REDACTED--Test.SeleniumSearchUtils.SetDestinationToJuraWithoutSelectingDestinationInDropdown(IWebDriver driver)
2020-03-06T15:39:37.4590637Z [xUnit.net 00:02:24.81]         C:\agent\_work\25\s\Tests\--REDACTED--Test\Tests\ArticleSearchTest.cs(118,0): at --REDACTED--Test.ArticleSearchTest.SearchJuraSaturdaySaturdayWithoutDatesAndNoOsmSelectionResultIsPageUfi()
2020-03-06T15:39:37.4613895Z [xUnit.net 00:02:24.81]         ----- Inner Stack Trace -----
2020-03-06T15:39:37.4614741Z [xUnit.net 00:02:24.81]            at System.Net.HttpWebRequest.GetResponse()
2020-03-06T15:39:37.4615470Z [xUnit.net 00:02:24.81]            at OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo requestInfo)
2020-03-06T15:39:37.4616428Z [xUnit.net 00:02:24.81]       Output:
2020-03-06T15:39:37.4617060Z [xUnit.net 00:02:24.81]         Selenium target url: http://test.--REDACTED--.com/de/frankreich/camping-bretagne
2020-03-06T15:39:37.4617775Z [xUnit.net 00:02:24.82]   Finished:    --REDACTED--Test

Примечание. Я попытался добавить опцию no-sandbox в ChromeDriver, но безрезультатно. ОБНОВЛЕНИЕ: после подробного изучения журналов я наткнулся на эту строку:

OpenQA.Selenium.WebDriverException: HTTP-запрос к удаленному серверу WebDriver для URL http://localhost: 49946 / session / a0dac255bd41cc2bb8c6882761408f12 / element истекло время ожидания через 60 секунд.

Я абсолютно уверен, что URL-адрес, переданный методу GoToUrl, равен http://test.--REDACTED--.com/de/frankreich/camping-bretagne, действительный URL-адрес (который находится на удаленном компьютере) сервер, разрешение DNS и все)

Может ли localhost:49946 ссылаться на какой-то локальный компонент селена, который не был запущен должным образом? Я не смог найти больше информации об этом "бэкэнде" в журналах ошибок или в inte rnet ...

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Вы получаете очень явное исключение:

OpenQA.Selenium.NoSuchElementException: нет такого элемента: Невозможно найти элемент : {"method": "css selector "," selector ":" # autocomplete "}

Не удается, потому что не может найти элемент. Поскольку эти тесты работают локально, это наводит меня на мысль, что причиной ошибки является состояние гонки между веб-браузером и Selenium. Распространенным решением для этого является использование объекта WebDriverWait:

var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
var element = wait.Until(ExpectedConditions.PresenceOfElementLocated(By.CssSelector("#autocomplete")));

// now element exists

Эти условия гонки распространены, когда вы запускаете тесты на быстром локальном компьютере, но затем те же тесты не выполняются на сервере сборки, который скорее всего намного занятее, чем ваша машина.

0 голосов
/ 07 марта 2020

@ GregBurghardt ответ был почти идеальным (+1). Немного больше информации в терминах:

  • Соответствующая HTML
  • Строка кода
  • Информация о двоичной версии

помог бы нам проанализировать проблему лучше.


Однако, как вы видите:

OpenQA.Selenium.NoSuchElementException : no such element: Unable to locate element: {"method":"css selector","selector":"#autocomplete"}

Чтобы найти / взаимодействовать / щелкнуть элемент, вам нужно вызвать WebDriverWait в сочетании с Ожидаемые условия как ElementToBeClickable(), и вы можете использовать любую из следующих Стратегий локатора :

  • Id:

    var element = new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.Id("autocomplete")));
    
  • CssSelector:

    var element = new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("#autocomplete")));
    
  • XPath:

    var element = new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='autocomplete']")));
    

Ссылка

Вы можете найти пару соответствующих обсуждений в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...