【问题标题】:How to locate a checkbox to verify its state using Selenium and Python如何使用 Selenium 和 Python 定位复选框以验证其状态
【发布时间】:2021-12-18 08:22:53
【问题描述】:

我试图确定我们网站上的复选框是否处于选中状态。复选框的 HTML 如下:

<input id="ID_StaffIsRostered" name="ID_Rostering" type="checkbox" checked="" data-toggle="toggle" data-onstyle="success" data-size="sm" data-on="Yes" data-off="No" onchange="toggleRosteredStaff()">

我尝试通过这些定位器找到它:

  1. (By.ID, "ID_StaffIsRostered")
  2. (By.XPATH, "input[@name='ID_Rostering']"
  3. (By.XPATH,"//*[@id='ID_StaffIsRostered']")
  4. (By.XPATH,"/html/body/div[1]/div/div[2]/div/div/div/div[2]/table[3]/tbody/tr/td/div[1]/div[2]/div/form/div/div[1]/div/label/div/input")
  5. (By.CSS_SELECTOR,"label:nth-child(1) &gt; .btn-light .toggle-off")
  6. (By.XPATH,"//form[@id='ID_Form_Rostering']/div/div/div/label/div/div/label[2]")
  7. (By.XPATH,"//div/div/div/label/div/div/label[2]")

到目前为止没有任何效果。但是,我可以选择包含复选框的 div,以及复选框根据切换到的内容切换的标签,HTML 是:

<div class="toggle btn btn-success btn-sm" data-toggle="toggle" style="width: 7.5px; height: 26px; min-width: 38px;">

对于标签:

<div class="toggle-group"><label class="btn btn-success btn-sm toggle-on">Yes</label><label class="btn btn-light btn-sm toggle-off">No</label><span class="toggle-handle btn btn-light btn-sm"></span></div>

我可以通过哪些替代方法来实现这一目标?目前我正在使用 Selenium 4.0.0 和 Python 3.9

【问题讨论】:

    标签: python selenium selenium-webdriver checkbox html-input


    【解决方案1】:

    根据HTML Specification for Boolean attributes

    许多属性是布尔属性。一个的存在 元素上的布尔属性表示真值,并且 属性不存在代表假值。

    如果属性存在,它的值必须是空字符串 或属性的 ASCII 不区分大小写匹配的值 规范名称,没有前导或尾随空格。

    checked 属性可以用任何一种方式表示:

    <input name=name id=id type=checkbox checked>
    <input name=name id=id type=checkbox checked="">
    <input name=name id=id type=checkbox checked="checked">
    

    解决方案

    要验证复选框的状态,您可以探测 checked 属性,您可以使用以下代码块:

    try:
      WebDriverWait(browser, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "input#ID_StaffIsRostered[name='ID_Rostering'][checked]")))
      print("Checkbox is in checked state")
    except:
      print("Checkbox is in unchecked state")
    

    【讨论】:

    • 这行得通,谢谢。问题最终是我使用 EC.visibility_of_element_located 而不是 EC.presence_of_element_located。我认为因为它是一个自举复选框,硒只会查看复选框顶部的 div。再次,谢谢。
    【解决方案2】:

    我可以想到一些方法。

    element.get_attribute('checked')
    

    或者你可以查询javascript。

    return document.querySelector('input[name="ID_Rostering"]').checked;
    

    至于尝试 xpath 但它并不总是可靠的。

    //input[@type='checkbox' and not(@checked)]
    

    未选中

    //input[@type='checkbox' and @checked)]
    

    检查

    【讨论】:

      【解决方案3】:
      1. checkbox的checked参数会表示是否勾选,可以通过xpath获取该参数的状态(.../input[@checked])
      2. 仔细观察网站法规,勾选的复选框是否有特殊状态,如颜色、文字等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-21
        • 2018-06-25
        • 2019-03-16
        • 2012-01-20
        相关资源
        最近更新 更多