如何使用Splinter单击存在但不可见的复选框?(Selenium/Python)



源代码片段:

<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

返回True、False

看起来Splinter在点击框时遇到了问题,因为第二个输入块显示type='hidden'。然而,添加.first.click((并不能解决问题,我也没有什么想法。我可能错过了一些非常简单的东西!

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

在这种情况下,我通常使用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

拆分器语法可能有点错误。请根据需要参阅文档。

JavaScript"伪造"web代码时,这是一个已知的问题。@Mcdizzle在Selenium中的解决方案的一个变体是通过JavaScript:发出点击

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

相关内容

  • 没有找到相关文章

最新更新