此错误消息...
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
...意味着当WebDriver实例试图找到所需的元素时,它在HTML DOM中不可见。
ElementNotVisibleException
ElementNotVisibleException当元素存在于DOM 树上时抛出,但它不可见,因此无法与之交互。
原因
ElementNotVisibleException的一个积极意义是WebElement存在于 HTML 中,并且在尝试隐藏元素的属性click()
时通常会遇到此异常。read
解决方案
由于ElementNotVisibleException确保WebElement存在于 HTML 中,因此根据以下详细步骤,前面的解决方案将分为两部分:
如果下一步是读取所需元素的任何属性,则需要诱导WebDriverWait与设置为visibility_of_element_located的expected_conditions子句结合,如下所示:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
my_value = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "element_xpath"))).get_attribute("innerHTML")
如果您下一步是click()
在所需元素上调用,那么您需要诱导WebDriverWait与将 expected_conditions子句设置为element_to_be_clickable的结合,如下所示:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "element_xpath"))).click()
这个用例
您构建的xpath//h1[@class="sign-in-input"]
与任何节点都不匹配。我们需要创建唯一的xpath来定位表示 的元素Email Address
,Password
以及Sign In
诱导WebDriverWait的按钮。下面的代码块将帮助您实现相同的目标:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
options = Options()
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
driver = webdriver.Chrome(chrome_options=options, executable_path="C:\\Utility\\BrowserDrivers\\chromedriver.exe")
driver.get('https://www.TheGreatCoursesPlus.com/sign-in')
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@id='modal']//input[@name='email']"))).send_keys("abc@abc.com")
driver.find_element_by_xpath("//div[@id='modal']//input[@name='password']").send_keys("password")
driver.find_element_by_xpath("//div[@id='modal']//button[@class='color-site sign-in-button']").click()