如何使用selenium webdriver找到一个元素,它没有像Name,Id,title等唯一标识符?

时间:2015-01-24 12:14:18

标签: selenium selenium-webdriver

我是Selenium的新手。不确定如何处理这种情况。我正在一个网站上工作,该网站有几个按钮,代码如下,



<a class="Some big class name" datacommunication="SelectItem" token="some token number" model-id="Id1" element="button">
<i class="classname">Book Ticket</i>
</a>

<a class="Some big class name" datacommunication="SelectItem" token="some token number" model-id="Id2" element="button">
<i class="classname">Book Ticket</i>
</a>
&#13;
&#13;
&#13;

我尝试使用以下命令点击它, ele = driver.FindElement(By.ClassName("Some big class name"));但它失败并显示以下消息,不支持复合类名。考虑搜索一个类名并过滤结果。

ele = driver.FindElement(By.CssSelector("a[model-id='Id1']")); fails with 'Test method TestBot.HomeTest.bookTicket threw exception: 
OpenQA.Selenium.WebDriverTimeoutException: Timed out after 10 seconds'

尝试使用XPATH

ele = driver.FindElement(By.XPath("\\\a[@model-id='Id1']")); doesn't work either.

我无法控制html。无法改变它。

请告诉我如何识别此类情景中的元素。

6 个答案:

答案 0 :(得分:4)

您不能在类名中包含空格。这些实际上是由空格分隔的多个类。您可以使用css选择器

找到上述元素
var ele = driver.FindElements(By.CssSelector(".Some.big.class.name"))

当然,这将找到两个元素。要找到第一个,你可以使用

var ele = driver.FindElement(By.CssSelector("a[model-id='Id1']"))

您可以在此处找到有关css选择器的帮助:http://www.w3schools.com/cssref/css_selectors.asp

<强>更新

我刚注意到你的XPath似乎有错误的斜线。如果您想使用XPath,请尝试

//a[@model-id='Id1']

但请注意,css选择器的性能优于XPath。

答案 1 :(得分:1)

在Selenium WebDriver中有多种方法可以找到您的WebElement。 但始终记住所有都基于您的属性或HTML标记的组合,所以大小写可以是任何一个 1-第一种方式是使用id 2-第二个是姓名 3-班级名称 4-有时你可以使用Tagname 5-一些时间linkText 6-一些时间部分链接文本 7-使用xpath 8-使用css选择器

所以在你的情况下我们需要得到Xpath和Css Selector的帮助 所以你元素的xpath

语法:

//[@attribute ='value of selected tag']
例 id1:
//a[@model-id='Id1']
id2:
//a[@model-id='Id2']

以下两个元素都是css Selector 语法

 [attribute ='value']
ID1:

a[model-id='Id1']

ID2:

 a[model-id='Id2']

http://www.slideshare.net/weekendtesting/css-selector-29312437 http://www.slideshare.net/weekendtesting/locators-in-selenium-bnt-09

答案 2 :(得分:0)

findElements和findElement之间存在差异。

FindElement :findElement返回单个元素。

FindElements :返回相同元素的列表。在此示例中,有多个具有相同类名的类,因此请使用driver.findElements方法。

driver.findElements将返回具有该类名的所有元素的列表。 现在,您有所有元素的列表,但您只需要其中一个元素。 因此,迭代列表以从列表中获取单个元素。

List<WebElement> elementList= driver.FindElement(By.ClassName("Some.big.class.name"));

Iterator itr = elementList.iterator();

while(itr.hasNext()) 

 {
     WebElement element = itr.next();

      if(element.getAttribute("model-id").equals("Id1")){
          element.click();
          break;
        }//if block ends here
   }//while loop ends here

如果没有任何作用,您也可以使用XPATH

答案 3 :(得分:0)

非常感谢你的帮助。我使用以下代码来克服上述问题,

WebDriverWait wait = new WebDriverWait(driver,TimeSpan.FromSeconds(10));             wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector( “A [数据模型-ID = 'C5']”)))点击();

使用上面的代码,我可以点击按钮。

再次感谢您的帮助和知识共享。

阿米特

答案 4 :(得分:0)

您可以使用xpath进行定位。

WebElement ele = driver.findElement(By.xpath("//*[@class='Some big class name']"));

答案 5 :(得分:-2)

要识别硒中的元素,有多种方法。

要查看详细信息,请参阅BY Class.

尝试找到唯一可以识别元素的方法。如果可用的话,从id开始,如果没有任何效果,请使用XPATH。 XPATH比id和CSS选择器慢。