FindElements未返回所有匹配的元素

时间:2013-12-11 22:41:15

标签: c# selenium

我正在使用Selenium C#。这是我正在搜索的HTML(请原谅拼写 - 这不是转录错误):

<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>

我有一个到td元素的IWebElement引用(x)。但我无法“看到”里面的第二个锚元素。我尝试过两种主要方式。

方法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);
     }
}

使用此代码,它永远不会看到第二个锚(没有'class =“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;
}

同样,在这两种情况下,代码都看不到第二个锚。

我错过了什么?提前谢谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我深表歉意。事实证明Selenium正常工作 - 并返回所有元素。问题是运行自动化测试时使用的配置存在细微差别,以及我如何手动运行浏览器,导致浏览器页面内容不同。抱歉浪费了人们的时间!让我感到尴尬。