如何使用没有名称、ID、标题等唯一标识符的Selenium网络驱动程序定位元素?



我是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"));但失败并显示以下消息,不支持复合类名。请考虑搜索一个类名并筛选结果。

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

请让我知道如何在这种情况下识别元素。

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

有多种

方法可以在Selenium WebDriver中找到您的WebElement。但请始终记住,所有这些都基于您的属性或HTML标签的组合,因此大小写可以是其中任何一个1-第一种方法是使用id2-第二个是名称3- 类名4-有时您可以使用标签名称5-一些时间链接文本6-有时部分链接文本7-使用xpath时8-使用css选择器

所以在你的情况下,我们需要 Xpath 和 Css 选择器的帮助所以你的元素的路径

语法 :/

/[@attribute ='所选标签的值']
例id1:/
/a[@model-id='Id1']
id2:/
/a[@model-id='Id2']

对于这两个元素,以下是 css 选择器语法

 [属性 ='值']
编号1:
a[model-id='Id1']

编号2:

 a[model-id='Id2']

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

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

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

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

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

阿米特

您可以使用 xpath 进行定位。

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

findElements和findElement之间存在差异。

FindElement:findElement 返回单个元素。

查找元素 :返回相同元素的列表。如本例所示,有多个类名相同的类,因此请使用 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 ,如果没有任何效果

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

要查看详细信息,请参阅 BY 类。

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

相关内容

最新更新