Python 和 Selenium 以“execute_script”来解决“ElementNotVisibleException”
Python and Selenium To “execute_script” to solve “ElementNotVisibleException”
我正在使用 Selenium 保存网页。单击某些复选框后,网页内容将发生变化。我想要的是单击一个复选框,然后保存页面内容。 (复选框由 JavaScript 控制。)
首先我使用了:
driver.find_element_by_name("keywords_here").click()
它以错误结束:
NoSuchElementException
然后我尝试了“xpath”,implicit/explicit 等待:
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
帖子
How to force Selenium WebDriver to click on element which is not currently visible?
建议它应该在单击之前使复选框可见,例如使用:
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
另一种选择是将 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()
我在预期条件方面遇到了一些问题,我更喜欢构建自己的超时。
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
我正在使用 Selenium 保存网页。单击某些复选框后,网页内容将发生变化。我想要的是单击一个复选框,然后保存页面内容。 (复选框由 JavaScript 控制。)
首先我使用了:
driver.find_element_by_name("keywords_here").click()
它以错误结束:
NoSuchElementException
然后我尝试了“xpath”,implicit/explicit 等待:
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
帖子
How to force Selenium WebDriver to click on element which is not currently visible?
建议它应该在单击之前使复选框可见,例如使用:
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
另一种选择是将 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()
我在预期条件方面遇到了一些问题,我更喜欢构建自己的超时。
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