2016-04-27 2 views
0

Допустит, у меня есть объект страницыПопытки преобразовать IWebElement в элементную

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

я пытаюсь передать, что в этот метод, чтобы преобразовать IWebElement в By элемент.

public void MoveAndClick(IWebElement element) 
{ 
    var findElement = driver.FindElement((By)element); 

    Actions act = new Actions(driver); 
    act.MoveToElement(findElement); 
    act.Click(findElement); 
    act.Perform(); 
} 

Я знаю, что этот кусок кода будет работать без заливки элемента в By элемент, однако для моих тестов на работу, мне нужно, чтобы выяснить, как преобразовать IWebElement в By элемент.

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

+1

http://stackoverflow.com/a/31677984/2246511 – jibbs

ответ

1

Короткий ответ, это невозможно. Разработчики Selenium решили, что для этого нет полезных вариантов использования.

0

Вы можете использовать получить уникальный атрибут элемента:

IWebElement element = driver.FindElements(/* Example */By.Id("ID")); 
String id = item.GetAttribute("id"); 
By elemBy = By.Id(id); 
+0

Что делать, если атрибут ID отсутствует? –

1

Селен не дает нам селектор в IWebElement, но можно создать селектор с помощью JavaScript:

public static By ConvertToBy(this IWebElement element) 
{ 
    if (element == null) throw new NullReferenceException(); 

    var attributes = 
     ((IJavaScriptExecutor) SeleniumWebDriver.Driver).ExecuteScript(
      "var items = {}; for (index = 0; index < arguments[0].attributes.length; ++index) { items[arguments[0].attributes[index].name] = arguments[0].attributes[index].value }; return items;", 
      element) as Dictionary<string, object>; 
    if (attributes == null) throw new NullReferenceException(); 

    var selector = "//" + element.TagName; 
    selector = attributes.Aggregate(selector, (current, attribute) => 
     current + "[@" + attribute.Key + "='" + attribute.Value + "']"); 

    return By.XPath(selector); 
} 

It создаст XPath с именем тега и всеми именами и значениями attr, что-то вроде этого: "//a[@class='test test-test'][@id='test-id'][@custom='custom-value']"

Будьте осторожны: поскольку у вас нет правильного пути к переходу сформируйте IWebElement в By, расширение может возвращать дублированные результаты, если на странице есть другой элемент с тем же именем тега и именами и значениями attrs.

1

я бы не рекомендовал его, но вы можете сделать это с помощью Reflection -

внутри вашего метода с помощью IWebElement 'элемент' ссылка:

//Get the RealProxy of the element 
var elementProxy = System.Runtime.Remoting.RemotingServices.GetRealProxy(element); 

//Get the Bys from the RealProxy:  
var bysFromElement = (IReadOnlyList<object>)elementProxy 
    .GetType() 
    .GetProperty("Bys", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public)? 
    .GetValue(elementProxy); 

//Convert bysFromElement to a list of strings for manipulation, or convert into a list of By objects, i.e.:  
var bys = new List<string>(); 
if (bysFromElement != null) 
{ 
    bys.AddRange(bys.Select(@by => @by.ToString())); 
} 

и там вы идете

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