2017-02-16 3 views
0

Я создаю платформу для тестирования, моя цель - проверить многие веб-сайты, которые имеют похожие страницы со слабой разницей между собой, используя эту структуру.Selenium Dynamic Selectors for WebElements

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

Я пытаюсь построить что-то вроде этого:

public class WebComponent 
     { 
      public int ID { get; set; } 
      public string Name { get; set; } 
      public string Description { get; set; } 
      public IWebElement WebElement{get;set;} 
      public Accessor Accessor { get; set; } 
      public WebComponent() 
      { 
       Accessor = new Accessor(); 
      } 

    } 
    public class Accessor 
    { 
     OpenQA.Selenium.By By { get; set; } 
     public string Value { get; set; } 
    } 

И позже в моем коде, когда я хочу, чтобы иметь экземпляр этого класса:

WebComponent component = new WebComponent(); 
component.ID = 1; 
component.Name = "Logout Button"; 
component.Description = "The button to click when user wants to logout of website"; 
component.Accessor.By = By.Id; 
component.Accessor.Value = "logout"; 
component.WebElement = Browser.Driver.FindElement(//missing code); 

Мой вопрос, как я могу найти WebElement с использованием компонента.Accessor, любые советы или предлагаемые изменения будут высоко оценены.

ответ

1

By.Id - группа методов, вы не можете назначить ее для ввода OpenQA.Selenium.By. Назначение должно быть

component.Accessor.By = By.id("logout"); // or any other By and value. 

И тогда вы можете найти элемент, используя

component.WebElement = Browser.Driver.FindElement(component.Accessor.By); 

Редактировать

Чтобы выбрать локатор и значение динамически вы можете сделать что-то вроде

private By chooseType(String locatorType, string value) { 
    switch(locatorType) { 
     case "id": 
      return By.id(value); 
     case "class": 
      return By.className(value); 
     //... 
    } 
} 
+0

но это wa y не позволит мне иметь метод динамического доступа, который может измениться между {Id, Name, ClassName и т. д.} –

+0

@YahyaHHussein Почему бы и нет? вы можете сделать 'component.Accessor.By = By.Id (" logout ");' и line под 'component.Accessor.By = By.className (" someClass ");'. 'Теперь компонент.Accessor.By' является' By.className («someClass»); ' – Guy

+0

Думайте, если я хочу, чтобы тестер выбрал метод доступа с помощью combobox. этот способ потребует, если условие для каждого метода доступа. –

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