如何使用没有唯一标识符(如名称、ID、标题等)的 selenium webdriver 定位元素?

How to locate an element using selenium webdriver which doesn't have unique identifier like Name, Id, title etc?

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

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

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。无法更改。

请告诉我如何在这种情况下识别元素。

class 名字中不能有 space。这些实际上是由 space 分隔的多个 classes。您可以使用 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。

硒元素的鉴别方法有多种。

详情请参考BY Class.

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

findElements 和 findElement 有区别。

FindElement: 找到元素return是一个元素。

FindElements : returns a list of same element.As 在这个例子中有多个 class具有相同的 class 名称,因此使用 driver.findElements 方法。

driver.findElements 将 return 具有该 class 名称的所有元素的列表。 现在,您拥有所有元素的列表,但您只需要其中一个元素。 因此遍历列表以从列表中获取单个元素。

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 ,如果不起作用的话

有多种方法可以在 Selenium WebDriver 中找到您的 WebElement。 但请始终记住,所有内容都基于您的属性或 HTML 标签的组合,因此大小写可以是其中任何一个 1- 第一种方法是使用 id 2- 第二个是名字 3- Class 姓名 4- 有时您可以使用 Tagname 5- 一段时间 link文本 6- 有时部分 link 文本 7- 使用 xpath 8- 使用 css 选择器

所以在你的情况下我们需要借助 Xpath 和 Css 选择器 所以你元素的 xpath

语法:

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

后面的两个元素都是css选择器 语法

 [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

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

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("a[data-model-id='c5']"))).点击();

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

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

阿米特

可以使用xpath定位。

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