如何使用Python中的Selenium WebDriver按照html选择复选框

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Python中的Selenium WebDriver按照html选择复选框相关的知识,希望对你有一定的参考价值。

我有一个复选框,我需要使用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

答案

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

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

checkElement.click();
另一答案

这是你可以这样做的一种方法:

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

但是没有'安全'的方式知道按钮是否被按下,所以请记住这一点。如果要确定是否单击了复选框,可以在input元素上实现change eventHandler。

另一答案

根据你的HTML,你复选框是一个Angular元素,所以要在它上面调用click()你必须诱导WebDriverWait所需的元素是可点击的,你可以使用以下任一解决方案:

  • CSS_SELECTORWebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.ng-pristine.ng-untouched.ng-valid.ng-empty#diDataCheck[name='Mode']"))).click()
  • XPATHWebDriverWait(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

以上是关于如何使用Python中的Selenium WebDriver按照html选择复选框的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Selenium firefox 驱动只截取浏览过的页面

如何用python的selenium提取页面所有资源加载的链接

selenium 常用api

Python爬虫之爬取页面内容图片以及用selenium爬取

Selenium 验证 div 是不是有滚动条

Chrome如何设定webdriver=undefined以避免Selenium检测?