<p>此错误消息</p>
<pre><code>selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
</code></pre>
<p>…意味着所需的<strong>元素在<a href="https://www.w3schools.com/js/js_htmldom.asp" rel="nofollow noreferrer">HTML DOM</a>中不可见,而<em>WebDriver</em>实例正在尝试查找它</p>
<hr/>
<h2>ElementNotVisibleException</h2>
<p><a href="https://seleniumhq.github.io/selenium/docs/api/py/common/selenium.common.exceptions.html#selenium.common.exceptions.ElementNotVisibleException" rel="nofollow noreferrer">ElementNotVisibleException</a>在<a href="https://javascript.info/dom-nodes" rel="nofollow noreferrer">DOM Tree</a>上存在元素时抛出,但该元素不可见,因此无法与之交互</p>
<hr/>
<h2>理由</h2>
<p><strong>元素NotVisibleException</strong>的一个可能的优点是<em>WebElement</em>在HTML中是<strong>存在的,当试图<code>click()</code>或<code>read</code>隐藏的元素属性时,通常会遇到此异常</p>
<hr/>
<h2>解决方案</h2>
<p>As<em>ElementNotVisibleException</em>确保<em>WebElement</em>在HTML中<strong>存在</strong>,因此前面的解决方案将是两倍,如下所述:</p>
<ul>
<li><p>如果下一步是<strong>读取所需元素的任何属性,则需要将<a href="https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.wait.html#module-selenium.webdriver.support.wait" rel="nofollow noreferrer">WebDriverWait</a>与<a href="https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html#module-selenium.webdriver.support.expected_conditions" rel="nofollow noreferrer">expected_conditions</a>子句一起归纳为<a href="https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html#selenium.webdriver.support.expected_conditions.visibility_of_element_located" rel="nofollow noreferrer">visibility_of_element_located</a>,如下所示:</p>
<pre><code>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")
</code></pre></li>
<li><p>如果下一步是在所需元素上调用<strong><code>click()</code></strong>,则需要结合<a href="https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html#module-selenium.webdriver.support.expected_conditions" rel="nofollow noreferrer">expected_conditions</a>子句将<a href="https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.wait.html#module-selenium.webdriver.support.wait" rel="nofollow noreferrer">WebDriverWait</a>归纳为<a href="https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html#selenium.webdriver.support.expected_conditions.element_to_be_clickable" rel="nofollow noreferrer">element_to_be_clickable</a>,如下所示:</p>
<pre><code>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()
</code></pre></li>
</ul>
<hr/>
<h2>这个用例</h2>
<p>构造为<code>//h1[@class="sign-in-input"]</code>的xpath</em>与任何节点都不匹配。我们需要创建唯一的<em>xpath</em>来定位表示<code>Email Address</code>、<code>Password</code>和<code>Sign In</code>的元素。下面的代码块将帮助您实现相同的目标:</p>
<pre><code>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()
</code></pre>