6

我正在使用 Selenium 来保存网页。单击某些复选框后,网页的内容将发生变化。我想要的是单击一个复选框,然后保存页面内容。(复选框由 JavaScript 控制。)

首先我使用:

driver.find_element_by_name("keywords_here").click()

它以错误结束:

NoSuchElementException

然后我尝试了类似“xpath”的隐式/显式等待:

URL = “the url”

verificationErrors = []
accept_next_alert = True

aaa = driver.get(URL)
driver.maximize_window()
WebDriverWait(driver, 10)

#driver.find_element_by_xpath(".//*[contains(text(), ' keywords_here')]").click()
#Or: 

driver.find_element_by_xpath("//label[contains(text(),' keywords_here')]/../input[@type='checkbox']").click()

它给出了一个错误:

ElementNotVisibleException

帖子

如何强制 Selenium WebDriver 单击当前不可见的元素?

硒元素不可见异常

建议它应该在单击之前使复选框可见,例如使用:

execute_script

这个问题可能听起来很愚蠢,但是我怎样才能从页面源代码中找到正确的句子来“execute_script”复选框的可见性?

除此之外,还有其他方法吗?

谢谢。

顺便说一句,行 html 代码如下所示:

<input type="checkbox" onclick="ComponentArt_HandleCheck(this,'p3',11);" name="keywords_here">

它的 xpath 看起来像:

//*[@id="TreeView1_item_11"]/tbody/tr/td[3]/input
4

2 回答 2

10

另一种选择是制作click()内部execute_script()

# wait for element to become present
wait = WebDriverWait(driver, 10)
checkbox = wait.until(EC.presence_of_element_located((By.NAME, "keywords_here")))

driver.execute_script("arguments[0].click();", checkbox)

在哪里EC导入为:

from selenium.webdriver.support import expected_conditions as EC

或者,作为在黑暗中的另一个镜头,您可以使用element_to_be_clickable预期条件并以通常的方式执行单击:

wait = WebDriverWait(driver, 10)
checkbox = wait.until(EC.element_to_be_clickable((By.NAME, "keywords_here")))

checkbox.click()
于 2015-07-14T04:13:10.117 回答
1

我对预期条件有一些问题,我更喜欢建立自己的超时。

import time
from selenium import webdriver
from selenium.common.exceptions import \
    NoSuchElementException, \
    WebDriverException
from selenium.webdriver.common.by import By

b = webdriver.Firefox()
url = 'the url'
b.get(url)
locator_type = By.XPATH
locator = "//label[contains(text(),' keywords_here')]/../input[@type='checkbox']"
timeout = 10
success = False
wait_until = time.time() + timeout
while wait_until < time.time():
    try:
        element = b.find_element(locator_type, locator)
        assert element.is_displayed()
        assert element.is_enabled()
        element.click() # or if you really want to use an execute script for it, you can do that here.
        success = True
        break
    except (NoSuchElementException, AssertionError, WebDriverException):
        pass
if not success:
    error_message = 'Failed to click the thing!'
    print(error_message)

可能要添加 InvalidElementStateException 和 StaleElementReferenceException

于 2018-09-10T21:15:40.487 回答