【问题标题】:Clicking on span element existing in li in selenium单击硒中 li 中存在的 span 元素
【发布时间】:2016-01-12 20:13:46
【问题描述】:

我一直在尝试在 selenium 中单击具有名为 bullet 的类的 span 元素。这是一个树形结构,一旦单击它就会展开它的子项。我已经尝试过以下方式,但它不起作用。 下面是用户界面代码

<ul id="treelist" class="ltree">
<li class="liClosed">
<span class="bullet"> </span>
<b>Setup</b>
<ul>
 <li></li>
 <li></li>............
 .....................
</ul>
</li>
</ul>

错误是: 给定的选择器 //*ul[@id='treelist']//li[2]//span 无效或不会生成 WebElement

我使用的代码是:

WebDriver driver = new FirefoxDriver();
 driver.get("http://somewebapp");    
  WebElement userElement = driver.findElement(By.xpath("//*ul[@id='treelist']//li[2]//span"));

我尝试了多种编辑 xpath 的方法,但都没有成功。有人可以帮忙解决这个问题吗?

【问题讨论】:

    标签: javascript java html selenium


    【解决方案1】:

    XPath表达式确实无效,去掉ul前的*

    //ul[@id='treelist']//li[2]//span
    

    这是另一种定位所需span 标签的方法:

    //ul[@id='treelist']//span[@class='bullet']
    

    或者,使用 CSS 选择器

    driver.findElement(By.cssSelector("ul#treelist span.bullet"));
    

    【讨论】:

    • 我也试过了,它会抛出 nosuchelement 异常。无法定位元素:{"method":"xpath","selector":"//ul[@id='treelist']//li[2]//span"}
    • 感谢您的宝贵时间,但上述所有答案都出现同样的错误--> 无法找到元素:{"method":"css selector","selector":"ul#treelist span.子弹”}。有什么我想念的吗?
    • @rick 快速检查 - 页面上有 iframe 元素吗?
    • 是的,在页面中存在称为框架集和框架的东西,其中存在整个元素。抱歉,我是这个框架的新手,所以这是造成这个问题的原因吗?
    【解决方案2】:

    如果您没有绑定到 XPath,您可以尝试一个简单的 CSS 选择器。

    WebElement userElement = driver.findElement(By.cssSelector("span.bullet"));
    

    看起来您需要处理存在于框架内的元素。你可以在谷歌上搜索很多如何做到这一点的例子,但这里有一个来自 SO。

    Find elements inside forms and iframe using Java and Selenium WebDriver

    【讨论】:

    • CSS 选择器比 XPATH 可靠得多,特别是当您有语义类名称时。这个答案的唯一问题是它没有解决问题,它只是一种解决方法。
    • @JuanMendes 很大程度上取决于 XPath 的制作方式。我看到很多人只是通过右键单击开发工具栏中的某些元素来获得完整的 XPath,而且很多时候非常脆弱。手工制作的选择器不那么脆弱,但我发现 CSS 选择器比 XPath 搜索更简单、更快捷……但这就是我。
    • 使用 XPATH 尝试按类名选择元素非常困难,特别是如果您想选择类为 object 而不是 object-anything-else 的项目。因此,如果你在类属性中添加语义信息,那么获得可靠的钩子会容易得多。
    • 我有许多带有类子弹的 li 元素,但我只想选择 ul 中从顶部开始的第二个 li,这就是为什么我将代码编写为 By.xpath("//*ul[@id ='treelist']//li[2]//span") ,你能建议如何到达第二个li吗?
    【解决方案3】:

    您的span.bullet is not 在第二个li 中,它在第一个中。试试

    //ul[@id='treelist']//li[1]//span
    

    【讨论】:

    • 我有许多带有类子弹的 li 元素,但我只想选择 ul 中从顶部开始的第二个 li,这就是为什么我将代码编写为 By.xpath("//*ul[@id ='treelist']//li[2]//span") ,你能建议如何到达第二个li吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2021-10-30
    • 1970-01-01
    • 2018-11-21
    • 2021-03-05
    • 2019-08-03
    • 2021-10-11
    相关资源
    最近更新 更多