如何在Python中使用Selenium WebDriver根据html选中复选框

时间:2018-08-31 07:55:06

标签: python selenium xpath css-selectors webdriver

我有一个复选框,需要使用Selenium进行选择。以下是HTML

<input id="diDataCheck" ng-model="$parent.DIDATA.IsSet" name="Mode" type="checkbox" class="ng-pristine ng-untouched ng-valid ng-empty" xpath="1">

我尝试使用它的idname甚至使用XPath访问它,但它似乎没有用。

CHECKBOX = (By.XPATH, ".//*[contains(text(), 'diDataCheck')]""") # using XPATH
CHECKBOX = (By.ID, "diDataCheck") # using id
CHECKBOX = (By.NAME, "Mode") # using name

我在上面将其用作:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable(CHECKBOX)).click()

我也将上面的行放在try except中,但在Exception message中却什么也没有。

当我将WebDriverWait()更改为:

driver.find_element_by_id("diDataCheck").click()

我有例外:

Message: element not visible

3 个答案:

答案 0 :(得分:1)

这是您可以执行此操作的一种方法:

driver.execute_script("document.getElementById('diDataCheck').click()")

但是没有知道按钮是否被按下的“安全”方法,因此请记住这一点。如果要确定是否已单击复选框,可以在输入元素上实现change eventHandler。

答案 1 :(得分:0)

根据 HTML ,您已经忽略了复选框Angular元素,因此要在其上调用click(),必须引诱< em> WebDriverWait 以获得所需的可点击的元素,您可以使用以下解决方案之一:

  • CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.ng-pristine.ng-untouched.ng-valid.ng-empty#diDataCheck[name='Mode']"))).click()
    
  • XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='ng-pristine ng-untouched ng-valid ng-empty' and @id='diDataCheck'][@name='Mode']"))).click()
    

注意:您必须添加以下导入:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

答案 2 :(得分:0)

您可以在等待条件下使用此XPath

checkElement = WebDriverWait(driver, 20).until(
EC.element_to_be_clickable((By.XPATH, "//input[@name='Mode' and  @type='checkbox']")));

checkElement.click();