2014-11-13 2 views
-1

Я пишу свой первый тест на селен. Это потрясающе, и у меня есть вход в мое приложение, которое заставляет меня чувствовать головокружение. Вот мой автоматизированный материал 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> 

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

ответ

0

Правильный способ сделать это, кажется, использует selenium wait functionality (который я только что обнаружил). При добавлении этого:

driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10)); 

к началу моего метода CreateTenant(), селен ждет до 10 секунд для элемента, чтобы стать доступным, и добавляя, что работал. Не знаю, почему нить сна не делает.

+2

Всегда лучше избегать .sleep в селене и позволять имтическому ожиданию сделать это за вас. –

+1

С помощью 'Thread.sleep', как у вас есть в вашем коде, он будет ждать 1 секунду, прежде чем пытаться найти элемент. Это не гарантирует доступность и/или видимость элемента. Если вы сбросите время сна на 10 секунд, это, вероятно, сработает. Но теперь вы заставляете свой код ждать 10 секунд, даже если элемент становится доступным внутри, скажем, 5 секунд. Это основная причина, по которой не использовать thread sleep, поскольку он привязывает вас к жесткому пределу. – shri046

+0

Отличная точка sonicBlis! –

Смежные вопросы