Я пишу свой первый тест на селен. Это потрясающе, и у меня есть вход в мое приложение, которое заставляет меня чувствовать головокружение. Вот мой автоматизированный материал UI с помощью ChromeDriver:Почему селение не увидит мой элемент?
var options = new ChromeOptions();
options.AddArgument("--start-maximized");
IWebDriver driver = new ChromeDriver(options);
Authentication.LogInAsAdmin(driver);
System.Threading.Thread.Sleep(1000);
TenantManagement.CreateTenant(driver, false);
Authentication.LogInAsAdmin работает просто отлично. Мое одноглавое угловое приложение (при входе в систему) загружает дополнительный контент и отображает его. TenantManagement.CreateTenant (драйвер, ложь) - это то, где все идет не так. Первая строка в этой части не удается:
public static bool CreateTenant(IWebDriver driver, bool testLogin)
{
driver.FindElement(By.Id("TenantsTab")).Click();
...
}
Как вы можете видеть, у меня есть сон нить перед этим вызовом просто чтобы убедиться, что все загружено, прежде чем пытаться найти элемент. При взгляде на HTML в Chrome Дев инструментов (элемент ревизор), я вижу:
<li ng-class="{active: active, disabled: disabled}" id="TenantsTab" ng-repeat="Tab in SelectedArea.Pages | filter:lessThanTwo" ng-click="trackTab(Tab)" active="Tab.active" heading="Tenants" class="ng-isolate-scope">
<a ng-click="select()" tab-heading-transclude="" class="ng-binding">Tenants</a>
</li>
Этого элемент, безусловно, присутствует, когда поток пробуждается назад и пытается найти его, но это не было найдено. Какие-нибудь подсказки о том, что я делаю неправильно здесь или как можно было бы решить эту проблему при использовании селена?
Всегда лучше избегать .sleep в селене и позволять имтическому ожиданию сделать это за вас. –
С помощью 'Thread.sleep', как у вас есть в вашем коде, он будет ждать 1 секунду, прежде чем пытаться найти элемент. Это не гарантирует доступность и/или видимость элемента. Если вы сбросите время сна на 10 секунд, это, вероятно, сработает. Но теперь вы заставляете свой код ждать 10 секунд, даже если элемент становится доступным внутри, скажем, 5 секунд. Это основная причина, по которой не использовать thread sleep, поскольку он привязывает вас к жесткому пределу. – shri046
Отличная точка sonicBlis! –