2013-12-11 37 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引用(x)与TD元素。但是我一直无法“看到”里面的第二个锚元素。我尝试了两种主要方法。

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

有了这个代码,它永远不会看到第二锚(一个没有 '类= “名称”')。

第二种方法是:

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(“Name”)只会找到第一个锚点,这两个方法都可以看到(获取产品名称)。但我看不到价格元素。 – Moffat

+0

你的第一个代码对我来说工作正常......那么'x.FindElements(By.TagName(“a”))'返回什么?里面有1个元素的集合?这是什么浏览器?在你的第二部分代码中,我假设你的意思是代替'price'变成'1,999.00',它只是'-1'? – Arran

回答

0

在:

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

GetAttribute()将返回null如果属性不存在。在此示例中,第二个a标记不具有class属性,并返回null。在null上调用Equals()会导致空指针异常,导致至少for循环退出。在GetAttribute()方法

文档: http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebElement.html#getAttribute(java.lang.String)

+0

查理:当!谢谢 - 你是对的 - 我会解决的!但是,异常不会发生,因为该代码永远不会执行,因为FindElements不会返回具有空类属性的(如使用By.CssSelector的第二种方法所示)。 – Moffat

+0

在第二个示例中,您要搜索的ID都以下划线结尾,其中ID实际上末尾没有下划线 – Charlie

+0

是 - 我正在使用id^=构造匹配其id为该字符串开头的任何元素。我承认,我以前只用过一次,但成功据我所知,所以我不完全相信我正确使用它。但是,由于使用该构造确实可以找到ProductNameLink的第一个锚点,所以我必须假定它应该用于ProductPriceLink的第二个锚点。但它仍然没有找到它。 – Moffat

0

我深刻的道歉。事实证明Selenium工作正常 - 并返回所有元素。问题是运行自动化测试时使用的配置和我手动运行浏览器的方式存在细微的差异,导致浏览器页面内容不同。对不起浪费人们的时间!让我感到尴尬。

相关问题