Python和Selenium以"execute_script"来解决"ElementNotVisibleException"

Mar*_*k K 4 javascript python selenium selenium-webdriver execute-script

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

首先我用过:

driver.find_element_by_name("keywords_here").click()
Run Code Online (Sandbox Code Playgroud)

它以错误结束:

NoSuchElementException
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用"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()
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误:

ElementNotVisibleException
Run Code Online (Sandbox Code Playgroud)

帖子

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

Selenium元素不可见异常

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

execute_script
Run Code Online (Sandbox Code Playgroud)

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

除此之外,还有另一种方式吗?

谢谢.

顺便说一句,行html代码看起来像:

<input type="checkbox" onclick="ComponentArt_HandleCheck(this,'p3',11);" name="keywords_here">
Run Code Online (Sandbox Code Playgroud)

它的xpath看起来像:

//*[@id="TreeView1_item_11"]/tbody/tr/td[3]/input
Run Code Online (Sandbox Code Playgroud)

ale*_*cxe 6

替代选择是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)
Run Code Online (Sandbox Code Playgroud)

其中EC进口为:

from selenium.webdriver.support import expected_conditions as EC
Run Code Online (Sandbox Code Playgroud)

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

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

checkbox.click()
Run Code Online (Sandbox Code Playgroud)