【问题标题】:How do I click a checkbox that is present but not visible using Splinter? (Selenium/Python)如何单击存在但使用 Splinter 不可见的复选框? (硒/Python)
【发布时间】:2015-08-02 11:18:10
【问题描述】:

来源sn-p:

<div>
<div class="checkbox checkbox-primary margin-bottom-5 margin-top-5">
<input id="item" name="item" type="checkbox" value="true"/>
<label for="item">Item_Text</label>
<input name="item" type="hidden" value="false"/>
</div>

我正在尝试使用带有以下代码的 Splinter 单击此复选框:

browser.find_by_id('item')click()

我也试过 find_by_name。两者都产生以下异常:

(<class 'selenium.common.exceptions.ElementNotVisibleException'>, ElementNotVisibleException()

尝试调试:

print browser.is_element_present_by_id(item), browser.find_by_id(item).visible

返回真,假

Splinter 似乎无法单击该框,因为第二个输入块显示 type='hidden'。但是,添加 .first.click() 并不能解决问题,而且我没有想法。我可能遗漏了一些非常简单的东西!

【问题讨论】:

  • 可能 id 是重复的。尝试使用独特的 xpath 或 css。
  • 该 id 在页面上恰好使用了四次,都显示在那个 sn-p 中。在第一个输入标签(id/name)中两次,在标签中一次,在第二个隐藏输入标签(名称)中一次。我认为第二个输入标签导致它被隐藏,但我不知道如何只使用第一个标签,因为 .first 不起作用。在这种情况下,我将如何使用 xpath 或 css?
  • 还有&lt;div class="checkbox checkbox-primary margin-bottom-5 margin-top-5"&gt;的其他div吗?
  • 是的,我想在此页面上检查的每个此类复选框都存在(其中有 27 个)。每一个的结构都和贴出来的sn-p一样。

标签: jquery python ajax selenium splinter


【解决方案1】:

以下 javascript 执行解决了问题:browser.execute_script('document.getElementsByName("%s")[0].checked=true' % item)

【讨论】:

    【解决方案2】:

    在这种情况下,我通常使用xpath,因为复选框的label 是唯一的,并且更安全地正确识别元​​素。但是,您需要确保 id 不重复。这是为Selenium 测试提供ID 的主要部分。试试这个:

    //label[contains(text(),'Item_Text')]/../input[@type='checkbox']
    

    使用

    browser.find_by_xpath("//label[contains(text(),'Item_Text')]/../input[@type='checkbox']")
    

    上面应该根据标签Item_Text

    找到元素

    编辑

    尝试抓取列表,然后查找显示的列表并单击

    elements = browser.find_by_xpath("//label[contains(text(),'Item_Text')]/../input[@type='checkbox']")
    for element in elements:
        if element.is_displayed():
            element.click()
            break
    

    Splinter 语法可能有点偏离。如有需要请参考doc

    【讨论】:

    • 您使用的 xpath 与我提供的完全不同。特别是`\\`(斜杠)。使用相同的斜线很重要
    • 我对 splinter 不太熟悉。但我假设你不需要 first 因为 xpath 应该只返回一个元素
    • 关于您的编辑:我可以使用您的代码创建元素列表。该列表如下所示:[, , ...]但是每个项目仍然不可见,所以我认为这不能解决问题。会通过 splinter 执行某种 javascript 来检查这些框吗?
    【解决方案3】:

    当网络代码被JavaScript“伪造”时,这是一个已知问题。 @Mcdizzle 在Selenium 中的解决方案的一种变体是通过JavaScript 发出点击:

    browser.execute_script('document.getElementById("%s").click()' % id_string)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-13
      • 1970-01-01
      • 2014-04-19
      • 2020-05-11
      • 1970-01-01
      • 2013-09-11
      相关资源
      最近更新 更多