Я столкнулся с проблемой во время некоторых из моих сценариев автоматизации 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