当前位置: 首页 > 知识库问答 >
问题:

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

易京
2023-03-14

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

<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(“一些大类名”) 但失败,并显示以下消息:不支持复合类名。考虑搜索一个类名并过滤结果。

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'

尝试使用< code>XPATH

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

我对html没有控制权。改不了。

请让我知道如何识别此类场景中的元素。

共有3个答案

梁烨烨
2023-03-14

非常感谢你的帮助。我使用了以下代码来解决上述问题:

WebDriverWait wait=新的WebDriverWait(驱动程序,时间跨度从秒(10));等待.直到(ExpectedConditions.ElementIsVisible(由.CssSelector(“a[data model id='c5']))。单击();

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

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

阿米特

谭刚毅
2023-03-14

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

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

语法:

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

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

 [attribute ='value']
a[model-id='Id1']

ID2:

 a[model-id='Id2']

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

施招
2023-03-14

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

 类似资料:
  • 问题内容: 我在表中有一些数据,看起来大致如下: tickId和timestamp都不是唯一的,但是tickId和timestamp的组合应该是唯一的。 我的表中有一些重复的数据,并且我试图将其删除。但是,我得出的结论是,给定数据的信息不足,无法区分另一行,基本上没有办法删除重复的行之一。我的猜测是,我将需要引入某种身份列,这将有助于我从另一行中识别出一行。 这是正确的吗,还是有某种神奇的方法可以

  • 唯一标识符 guid(length = 32, firstU = true, radix = 62) 该函数可以生产一个全局唯一、随机的guid,默认首字母为u,可以用于当做元素的id或者class名等需要唯一,随机字符串的地方,因为id或者class不能以数字开头。 length <Number | null> guid的长度,默认为32,如果取值null,则按rfc4122标准生成对应格式的随

  • 问题内容: TLDR;如何在基于事件的编程模型中标识套接字。 我刚刚开始使用node.js,过去我在C ++和PHP sockets()中完成了大部分编码工作,所以node.js对我来说是非常新的东西。 在c ++中,我们可以通过编写主套接字(例如服务器)来侦听新的连接和更改,然后相应地处理这些连接,从而完成识别套接字的工作。 问题答案: 如果您在寻找实际的套接字而不是socket.io,那么它们

  • 我正在试着检测是否从短信中得到期望响应。所以我需要访问收到的文本的文本视图。我遇到的问题是我无法找到一种方法让驱动程序知道我需要接收的文本而不是发送的文本。 ui选择器的第一个图像显示了发送的文本被突出显示在这里它显示了id、class、package和resourse-id(不在帧内) 在ui选择器的第二个图像中,显示了接收到的文本,这里显示了id、class(超出帧)、package和reso

  • 问题内容: 我有一个包含以下各列的mysql表: 我想使其不存在任何两行,其中行x的group_id的值等于行y的group_id的值,行x的user_id的值也等于行y的user_id的值。 因此,例如,假设我插入以下值: 上面的数据,即使一个mysql查询试图插入它,如果已经存在具有group_id和user_id相同组合的行,也不应创建新行。有没有办法做到这一点?基本上,我试图使两列协同工作

  • 问题内容: 我需要做一些实验,并且需要知道javascript中对象的某种唯一标识符,因此我可以查看它们是否相同。我不想使用相等运算符,我需要类似python中的id()函数的功能。 是否存在这样的东西? 问题答案: 更新 我下面的原始答案写在6年前,其风格与时代和我的理解相吻合。为了回应评论中的某些对话,一种更现代的方法如下: 如果您对旧版浏览器有要求,请在此处查看的浏览器兼容性。 原始答案保留