你的目标是用什么元素来点击一个带有 selenium webdriver 的复选框?

What element do you target to click a checkbox with selenium webdriver?

提问人:Jeff Gordon 提问时间:11/3/2023 最后编辑:Jeff Gordon 更新时间:11/7/2023 访问量:62

问:

我正在尝试使用 selenium webdriver 单击网站上的复选框。复选框的 HTML 如下所示:

<input type="checkbox" name="registrationForm:certIndCB" id="registrationForm:certIndCB" value="true" onclick="continueAction();">

我尝试了以下代码:

# first code
driver_wait = WebDriverWait(driver, 10)
cert_info = driver_wait.until(EC.element_to_be_clickable((By.ID, 'registrationForm:certIndCB')))
cert_info.click()
# second code
cert_info = driver.find_element(By.ID,'registrationForm:certIndCB')
cert_info.click()
# third code
cert_info = driver.find_element(By.XPATH, "//input[@id='registrationForm:certIndCB']")
cert_info.click()

但都返回了错误。第一个代码收到超时错误,另外两个代码发送此错误:

---------------------------------------------------------------------------
NoSuchElementException                    Traceback (most recent call last)
Cell In[6], line 143
    139 time.sleep(3)
    141 # driver_wait = WebDriverWait(driver, 10)
    142 # cert_info = driver_wait.until(EC.element_to_be_clickable((By.ID, 'registrationForm:certIndCB')))
--> 143 cert_info = driver.find_element(By.ID,'registrationForm:certIndCB')
    144 cert_info.click()
    145 wait

我刷新了页面,确保元素没有弯曲并且保持为 .我的印象是选择更好的元素。有没有人可能知道为什么当我检查元素时它出现时它找不到元素?idregistrationForm:certIndCBid.click()

更新

所以,我意识到网站打开了一个新窗口,这是我的元素所在的位置。虽然,我希望这将是问题所在,但它仍然没有读取元素。我使用这段代码循环到正确的页面:

for window_handle in driver.window_handles:
    driver.switch_to.window(window_handle)
    if "name" in driver.title:
        break

但是,这仍然无法找到该元素。在尝试使用右键单击,然后选择并使用该选项,但我的程序说它找不到该元素。inspect elementCopyCopy Xpath / Copy Full Xpath

我还仔细检查了它,它不在 iFrame 中。

如果有人有见解,我会对为什么它不会检测到该元素感到困惑。是否有办法阻止网站选择元素?该站点由 user/pswd 访问,因此我无法使用跳过该步骤的 URL 绕过该元素(此步骤还会验证某些信息,因此我希望执行此步骤)。selenium

python html selenium-webdriver 点击

评论

0赞 Shawn 11/3/2023
检查所需元素是否在 ?IFRAME
0赞 Jeff Gordon 11/3/2023
完全透明:我必须查找 iframe 是什么,从我所做的研究来看,它似乎不在 iframe 中。我手动检查了页面源代码,没有 iframe 标记。如果这是不正确的检查方式,请告诉我,我看到您可以执行 JavaScript 代码来检查,但我对 JavaScript 语言或环境一无所知
0赞 Shawn 11/4/2023
查看下面的答案,了解如何使用来单击 Web 元素。JS

答:

1赞 Shawn 11/4/2023 #1

请参阅以下代码以在 python selenium 中使用单击 Web 元素:JavaScript

time.sleep(5)
radioButton = driver.find_element(By.ID,'registrationForm:certIndCB')
driver.execute_script("arguments[0].click();", radioButton )

评论

0赞 Jeff Gordon 11/4/2023
所以我收到了这个错误:它被击中了这一行:.该函数是从以下库下载的:。有什么见解吗?TypeError: Object of type Javascript is not JSON serializable--> 144 Javascript(driver.execute_script("arguments[0].click();", radioButton ))Javascript()from IPython.display import Javascript
1赞 JeffC 11/4/2023 #2

当您使用

(By.ID,'registrationForm:certIndCB')

Selenium 将其转换为 CSS 选择器

#registrationForm:certIndCB

CSS 选择器不喜欢 ID 中的 “:”s。我以前遇到过这个问题。我发现将其转换为CSS选择器的不同语法对我有用。

[id="registrationForm:certIndCB"]

下面是您的原始代码,使用新的 CSS 选择器进行了适当的等待更新。

driver_wait = WebDriverWait(driver, 10)
cert_info = driver_wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[id="registrationForm:certIndCB"]')))
cert_info.click()