2016-05-25 2 views
1

С учетом шаблона проектирования модели объектной модели страницы в Selenium мне нужно проверить, присутствует ли WebElement или включен/активирован на странице, прежде чем выполнять действие над ним.Как получить FindsByAttribute от IWebElement в C# Selenium? [Объектная модель страницы]

Базовый класс 'страница':

public class Page 
{    
    public Page() 
    { 
     PageFactory.InitElements(SeleniumTests.driver, this); 
    } 
} 

Унаследованная класс:

class Page_Certificate_ChooseOperator : Page 
    {    
     [FindsBy(How = How.Id, Using = "SearchOperatorName")] 
     public IWebElement txtName { get; set; } 

     [FindsBy(How = How.Id, Using = "SearchOperatorEstablishmentNumber")] 
     public IWebElement txtEstablishmentNumber { get; set; } 

     [FindsBy(How = How.Id, Using = "searchButton")] 
     public IWebElement btnSearch { get; set; } 

     public void SelectOperator(String name, String establishmentNumber) 
     { 
      this.txtName.SetInputField(name); 
      this.txtEstablishmentNumber.SetInputField(establishmentNumber);     
      this.btnSearch.SafeClick(); 
     }   
    } 

Наконец класс для методов расширения:

public static class SeleniumExtensionMethod 
    { 
     public static void SetInputField(this IWebElement webElement, String value) 
     { 
      webElement.Clear(); 
      webElement.SendKeys(value); 
     }  

     public static void SafeClick(this IWebElement webElement, int timeout_in_seconds) 
     {  
      //This is the difficult part. I need to check if the webElement is visible, but I don't want to write "low-level" code and specify the ID and selector. Is there a way I can find out how the webElement was created by this class and say something like "webElement.How" to find "How.ID" or "webElement.Using" to find "btnSearch"? I need to use something like the below code using the PageObject 
      // WebDriverWait wait = new WebDriverWait(SeleniumTests.driver, TimeSpan.FromSeconds(10)); 
      // IWebElement dynamicElement = wait.Until<IWebElement>(driver => driver.FindElement(By.Id("btnSearch"))); 
      // dynamicElement.Click(); 

      //Now, I just use this, but it crashes on NoSuchElementFound since it goes too fast. I don't want to use ImplicitWait. 
      btnSearch.Click(); 


     } 
    } 

Проблема я столкнулся заключается в том, что мне нужно ExplicitWaity, прежде чем нажимать на кнопку btnSearch, поскольку она выбрасывает NoSuchElem entFoundException. Поскольку я использую атрибут [FindsBy], я полагаю, что должен быть какой-то способ проверить, как webElement был найден/создан? Как я могу это сделать? Или как я могу иметь чистый код и использовать ExplicitWait для объекта страницы?

ответ

1

Ждать элемент должен присутствовать/включить/интерактивные, вы можете использовать официант с ElementToBeClickable условия:

[FindsBy(How = How.Id, Using = "searchButton")] 
public IWebElement btnSearch { get; set; } 

public void SelectOperator(String name, String establishmentNumber) 
{ 
    this.txtName.SetInputField(name); 
    this.txtEstablishmentNumber.SetInputField(establishmentNumber);     

    new WebDriverWait(SeleniumTests.driver, TimeSpan.FromSeconds(10)) 
     .Until(ExpectedConditions.ElementToBeClickable(this.btnSearch)) 
     .Click(); 
} 
+0

Это работает случайн, но иногда бросает TargetInvocationException произошло в WebDriver.Support.dll , Вы знаете, как это исправить? Это очень важно для успеха нашего проекта. Благодаря! –

+0

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

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