Webdriver - «NoSuchElementException» для веб-элемента, с которым уже взаимодействовали? - PullRequest
0 голосов
/ 26 июня 2019

Я столкнулся с проблемой во время некоторых из моих сценариев автоматизации Selenium (кажется, что это происходит случайно), когда элемент, с которым уже взаимодействовали, выдает исключение позже в ходе выполнения теста (не уверен, как или почему).

Например, существует метод с именем 'Login ()', который отправляет ключи в поле имени пользователя, отправляет ключи в поле пароля и затем нажимает кнопку входа в систему.

Вход в систему успешен, однако, локатор, связанный с вводом имени пользователя, приведет к сбою теста по истечении заданного периода времени (30 секунд) с показанным ниже -

'-> ошибка: элемент с локатором:' By.Id: username 'не был виден в течение срока ожидания'

При локальной проверке основной ошибкой является «NoSuchElementException», однако с элементом уже взаимодействовали.

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

Я попытался обновить версию драйвера chrome с 75.0.3770.8 до 75.0.3770.90, если не исключено, что это могло быть ошибкой, но это не помогло устранить проблему.

Было очень трудно копировать на моей локальной машине, возможно, это происходит один раз в каждые 20 тестов, и исключение действительно не дает мне продолжения.

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

public void Login(SomeUser user)
{
    this.Username.SendKeys(user.Username);
    this.Password.SendKeys(user.Password);
    this.Login.Click();
}

Последнее действие перед неудачей теста - это (как вы можете видеть) нажатие кнопки, поэтому я нахожу крайне странным, что взаимодействие с именем пользователя должно вызывать какие-либо проблемы.

Выполнение теста не является параллельным, поэтому я не могу указать на какую-либо проблему с многопоточностью.


Test Name:  
Test FullName:  ....Tests.Stories..
Test Source:    C:\\\\\src\...\Tests\Stories\.feature : line 36
Test Outcome:   Failed
Test Duration:  0:01:17.326

Result StackTrace:  
at ...Core.Utilities.Wait.ForElementToBeVisible(By elementLocator, Int32 timeout) in C:\\\Shared\...Core\Utilities\Wait.cs:line 96
   at ...Core.Extensions.ElementLocatorExtensions.SendKeysWithWait(By elementLocator, String text) in C:\\\Shared\...Core\Extensions\ElementLocatorExtensions.cs:line 147
   at ....Pages.Executors.LoginPage.Login(String userId) in C:\\\\\src\...\Pages\Executors\LoginPage.cs:line 12
   at ....Tests.Steps.LoginSteps.GivenIAmLoggedInAsCustomer(String id) in C:\\\\\src\...\Tests\Steps\LoginSteps.cs:line 16
   at lambda_method(Closure , IContextManager , String )
   at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration)
   at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments)
   at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(IContextManager contextManager, StepInstance stepInstance)
   at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep()
   at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors()
   at ....Tests.Stories..ScenarioCleanup()
   at ....Tests.Stories..() in C:\\\\\src\...\Tests\Stories\.feature:line 41
--WebDriverTimeoutException
   at OpenQA.Selenium.Support.UI.DefaultWait`1.ThrowTimeoutException(String exceptionMessage, Exception lastException)
   at OpenQA.Selenium.Support.UI.DefaultWait`1.Until[TResult](Func`2 condition)
   at ...Core.Utilities.Wait.ForElementToBeVisible(By elementLocator, Int32 timeout) in C:\\\Shared\...Core\Utilities\Wait.cs:line 92
--NoSuchElementException
   at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
   at OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById(String id)
   at OpenQA.Selenium.By.<>c__DisplayClass16_0.<Id>b__0(ISearchContext context)
   at OpenQA.Selenium.By.FindElement(ISearchContext context)
   at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by)
   at SeleniumExtras.WaitHelpers.ExpectedConditions.<>c__DisplayClass7_0.<ElementIsVisible>b__0(IWebDriver driver)
   at OpenQA.Selenium.Support.UI.DefaultWait`1.Until[TResult](Func`2 condition)
Result Message: 
OpenQA.Selenium.WebDriverTimeoutException : Element with locator: 'By.Id: username' wasn't visible within timeout limit
  ----> OpenQA.Selenium.WebDriverTimeoutException : Timed out after 30 seconds
  ----> OpenQA.Selenium.NoSuchElementException : no such element: Unable to locate element: {"method":"css selector","selector":"#username"}
  (Session info: chrome=75.0.3770.100)
Result StandardOutput:  
Given I am logged in as a 'NoWarningCode' customer
-> error: Element with locator: 'By.Id: username' wasn't visible within timeout limit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...