【问题标题】:selenium get li element based on index position and click the checkboxselenium 根据索引位置获取 li 元素并单击复选框
【发布时间】:2020-02-06 20:02:36
【问题描述】:

我现在有这个 HTML,使用 Selenium I ant 来切换具有给定索引位置的 li 元素,例如 1,它表示我想单击 spring 的切换复选框。

<ul id="todo-list" data-woven="abc">
<li class="active" data-index="0">
    <div class="view">
        <input class="toggle" type="checkbox">
        <label>Java</label>
        <button class="destroy"></button>
    </div>
    <input class="edit">
</li>
<li class="active" data-index="1">
    <div class="view">
        <input class="toggle" type="checkbox">
        <label>Spring</label>
        <button class="destroy"></button>
    </div>
    <input class="edit">
</li></ul>

我对 selenium 完全陌生,所以无法理解如何实现这一点。

我知道使用代码获取UL 元素:

driver.findElement(By.id("todo-list"));

现在如何根据其indexclick 对应的checkbox 获取li 元素。

【问题讨论】:

    标签: java selenium


    【解决方案1】:

    要单击与祖先 &lt;li&gt; 节点 index 属性相关的 checkbox 元素,您可以使用以下任一 Locator Strategies

    • cssSelector

      driver.findElement(By.cssSelector("ul#todo-list li.active[data-index='1'] input")).click();
      
    • xpath

      driver.findElement(By.xpath("//ul[@id='todo-list']//li[@class='active' and @data-index='1']//input")).click();
      

    【讨论】:

    • 现在我还有一个小问题,一旦我得到特定的li 元素,如果我想点击里面的带有destroy 类的按钮,该怎么做?我在 li 之后使用 xpath 方法访问按钮,但出现错误。
    • @learner 将input 替换为button,实际上是ul#todo-list li.active[data-index='1'] button
    • 我们可以用 xpath 做同样的过程吗?
    • @learner 有效 xpath://ul[@id='todo-list']//li[@class='active' and @data-index='1']//button
    • 此按钮操作出现element not interactable exception 错误
    【解决方案2】:

    您可以使用xpath 来定位带有data-index=1 的元素

    driver.findElement(By.xpath("//li[@data-index='1']//input[@class='toggle']"));
    

    或者cssSelector

    driver.findElement(By.cssSelector("[data-index='1'] .toggle"));
    

    【讨论】:

    • 谢谢,但是我这里不能基于文本 spring 进行比较,我只是想根据索引选择一个元素,我只是以 spring 为例。你能告诉我正确的语法吗?
    • 接下来我想点击它的切换复选框,怎么做,请告诉我
    【解决方案3】:

    你可以通过@Guy 给你的答案直接找到你正在寻找的元素,如果你确切知道 data-index 属性将被设置为什么,那将是正确的方法,但你也可以找到一个集合li 元素,然后像这样继续在每个元素中执行您需要的操作:

    var container = driver.findElement(By.id("todo-list"));
    
    var elements = container.findElements(By.tagName("li"));
    

    您可以使用元素循环遍历每个元素或直接转到您想要的元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2019-03-30
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      相关资源
      最近更新 更多