如何使用没有唯一标识符(如名称、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']"));
我是 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']"));