2013-12-11 3 views
1

Я использую Selenium C#. Вот HTML, что я ищу (пожалуйста, простите за орфографию - это не ошибка транскрипции):FindElements не возвращает все согласованные элементы

<td class="Search3-product-cell" align="left"> 
    <div class="SearchRersultsNameCell"> 
    <a id="MainPlaceHolder_ContentPlaceHolder_SearchMatrix_SearchResultView_ProductNameLink_33" class="Name">Tango 6 Pc. Queen Bedroom Set</a> 
    <br/> 
    <a id="MainPlaceHolder_ContentPlaceHolder_SearchMatrix_SearchResultView_ProductPriceLink_33">$1,999.00</a> 
    </div> 
</td> 

У меня есть ссылка IWebElement (х) к элементу тд. Но я не смог «увидеть» второй элемент привязки внутри него. Я пробовал два основных способа.

Метод 1:

foreach (IWebElement we in x.FindElements(By.TagName("a"))) // for each anchor element 
{ 
    if (we.GetAttribute("class").Equals("Name")) 
    { 
     name = we.Text; 
    } 
    else 
    { 
     price = Util.ConvertCurrencyToDecimal(we.Text); 
    } 
} 

С помощью этого кода, он никогда не видит второй якорь (тот без 'класс = "Name"').

Второй метод:

IWebElement x = elem.FindElement(By.ClassName("SearchRersultsNameCell")); 
myLocator = By.CssSelector("a[id^='MainPlaceHolder_ContentPlaceHolder_SearchMatrix_SearchResultView_ProductNameLink_']"); 
if (SeleniumHelpers.IsElementPresentNoWait(elem, myLocator)) 
{ 
    name = x.FindElement(myLocator).Text; 
} 
else 
{ 
    name = "Name not found"; 
} 

myLocator = By.CssSelector("a[id^='MainPlaceHolder_ContentPlaceHolder_SearchMatrix_SearchResultView_ProductPriceLink_']"); 
if (SeleniumHelpers.IsElementPresentNoWait(elem, myLocator)) 
{ 
    price = x.FindElement(myLocator).Text; 
} 
else 
{ 
    price = -1; 
} 

Опять же, ни в одном случае не код увидеть второй якорь.

Что мне не хватает? Заранее спасибо.

+0

Вы пытались вызвать второй элемент, используя 'By.className =" Name "'? – Brian

+0

Второй элемент привязки не имеет атрибута класса, поэтому поиск By.ClassName («Имя») найдет только первый якорь, который видят оба моих метода (чтобы получить имя продукта). Но я не вижу элемент цены. – Moffat

+0

Ваш первый код работает отлично для меня ... так что значит 'x.FindElements (By.TagName (" a "))' return? Коллекция из 1 элемента внутри? Что это за браузер? В вашей второй части кода я предполагаю, что вы имеете в виду, что вместо 'price' становится' 1,999,00', это просто '-1'? – Arran

ответ

0

В:

if (we.GetAttribute("class").Equals("Name")) 

GetAttribute() возвратит null, если атрибут не существует. В этом примере второй тег a не имеет атрибута class и возвращает null. Вызов Equals() на null приводит к исключению нулевого указателя, заставляя по крайней мере цикл for выйти.

Документация по методу GetAttribute(): http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebElement.html#getAttribute(java.lang.String)

+0

Charlie: Dang! Спасибо. Ты прав. Я исправлю это! Однако исключение не происходит, потому что этот код никогда не выполняется, потому что FindElements не возвращает с атрибутом нулевого класса (как видно из второго метода, использующего By.CssSelector). – Moffat

+0

В вашем втором примере идентификаторы, которые вы ищите в конце подчеркивания, где идентификаторы на самом деле не имеют подчеркивания в конце – Charlie

+0

Да - я использую конструкцию id^= для соответствия любому элементу, чей идентификатор начинается с этой строки. Я признаю, что я использовал это только один раз раньше, но, насколько я могу судить, успешно, поэтому я не уверен, что правильно его использую. Однако, поскольку использование этой конструкции действительно находит первый якорь с ProductNameLink, я должен предположить, что он должен работать для второго якоря с ProductPriceLink. Но он все еще не находит его. – Moffat

0

Мои глубокие извинения. Оказывается, Селен работает правильно - и возвращает все элементы. Проблема заключалась в тонкой разнице в конфигурации, используемой при запуске автоматических тестов, и о том, как я запускал браузер вручную, что приводило к разному содержимому страницы браузера. Извините за то, что тратишь время людей! Цвет меня смутил.

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