【问题标题】:Finding element with no id, class or name (webdriver/Eclipse/Java/automation)查找没有 id、类或名称的元素(webdriver/Eclipse/Java/automation)
【发布时间】:2018-02-21 02:20:13
【问题描述】:

我正在尝试创建一个基本的登录自动化测试,但页面上的submit 按钮没有唯一的class name, and id,那么如何找到它?

按钮的 HTML 如下:

<button class="btn btn-primary" type="submit" style="float:right;width:120px">Sign in</button>

有一个忘记密码按钮共享相同的类但不同的“类型”:

<button class="btn btn-primary" type="button" style="float:left;width:140px;padding-left:10px" onclick="showForgotPassword()">Forgotten Password?</button>

我尝试了下面的代码,但它对我不起作用。

driver.findElement(By.className("btn btn-primary")).click();

请大家帮忙,期待大家的回音。

【问题讨论】:

  • 你可以 1) 给元素添加一个 id,或者 2) (Selenium 例子)假设这个页面很少改变,通过元素文本找到driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]")
  • 您无法使用您共享的代码访问元素吗?
  • 我已经编辑了我的答案以包括按类别搜索

标签: java eclipse testing xpath automation


【解决方案1】:

在运行 webdriver 测试时,Xpath 和 Firebug 彼此不相关。您始终可以使用 xpath。

已编辑:

您仍然可以通过打开开发人员工具(按 F12)在 Firefox 中测试您的 xpath 表达式 -> 单击控制台选项卡并使用命令 $x("%xPath%") 输入您的表达式,在您的情况下,命令应该如下所示:

$x("//button[text()='Sign in']")

按 Enter 键,如果有一个元素数学运算,您将看到输出 Array [element],如果找到多个匹配项,则输出 Array [element1, element2];如果没有与您的表达式匹配,则输出 Array []。

关于如何定位您的按钮,这里有几个解决方案:

1) (假设我提供的 id 'loginField' 实际上是您的登录字段的 id)您可以在 login/password 元素上使用 submit() 方法

// Or just reference the login field as you did before, doesn't have to be id
WebElement loginField = driver.findElement(By.id("loginField"));
loginField.submit();

2) 你可以通过 xpath 调用它:

driver.findElement(By.xpath("//button[text()='Sign in']")).click();

3) 关于 className - 你需要使用 cssSelector 来代替:

driver.findElement(By.cssSelector("button.btn.btn-primary[type='submit']")).click();

这是因为 className 不适用于多个类,并且当元素的类属性中有空格时,这意味着它是“btn”和“btn-primary”类的成员,但并不是说它是“btn btn-primary”类的成员。

【讨论】:

  • 你用过的问题中的loginField在哪里?
  • 假设没有提供登录字段代码的id
  • 并非每个元素都必须有一个id.. 假设 id 在这种情况下可能会失败。
  • 不,它没有...... OP说我不能使用xpath,因为firebug不再作为firefox中的附加组件。并且没有@987654327这样的字段@,除了那个className已经试过了。
  • 我不是要求引用带有 ID 的字段。这甚至不是登录按钮。你能仔细重新阅读我的帖子吗?关于萤火虫的那句话对我来说没有多大意义。我也谈到了这一点。
【解决方案2】:

试试下面的代码。

driver.findElement(By.xpath("//button[text()='Sign in']")).click();

xpath的解释:-基于按钮文字Sign in,使用上面的xpath点击Sign in按钮。

【讨论】:

  • 嗨,Jainish,谢谢。它非常复杂,我正在尝试关注它,但引用了错误的按钮
  • 按钮的 HTML 在上面的问题中,即“提交”按钮。我把你提到的另一个按钮显示他们共享同一个类,这就是困难的来源
  • 我已经提供了每个 xpath 的正确解释,所以我想你应该接受我的回答。因为通过这个解释你可以创建相对的xpath。
  • 我已经更新了我的答案。请检查并更新我。
  • 如果解决了您的问题,请将此答案标记为Accepted
猜你喜欢
  • 2015-09-13
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2021-12-12
相关资源
最近更新 更多