<h2>WebDriverException:元素在点(x,y)处不可单击</h2>
<p>这是一个典型的<a href="http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriverException.html" rel="noreferrer">org.openqa.selenium.WebDriverException</a>,它扩展了java.lang.RuntimeException</em>。</p>
<p>此异常的字段为:</p>
<ul>
<li><a href="http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriverException.html#BASE_SUPPORT_URL" rel="noreferrer">BASE_SUPPORT_URL</a>:<code>protected static final java.lang.String BASE_SUPPORT_URL</code></li>
<li><a href="http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriverException.html#DRIVER_INFO" rel="noreferrer">DRIVER_INFO</a>:<code>public static final java.lang.String DRIVER_INFO</code></li>
<li><a href="http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/WebDriverException.html#SESSION_ID" rel="noreferrer">SESSION_ID</a>:<code>public static final java.lang.String SESSION_ID</code></li>
</ul>
<hr/>
<p>关于您的单个用例,错误告诉我们:</p>
<pre><code>WebDriverException: Element is not clickable at point (x, y). Other element would receive the click
</code></pre>
<p>从代码块中可以清楚地看到,您已经将<code>wait</code>定义为<code>WebDriverWait wait = new WebDriverWait(driver, 10);</code>,但是在<code>ExplicitWait</code>开始起作用之前,您正在对元素调用<code>click()</code>方法,如<code>until(ExpectedConditions.elementToBeClickable)</code>。</p>
<h2>解决方案</h2>
<p>错误<code>Element is not clickable at point (x, y)</code>可能由不同的因素引起。您可以通过以下任一过程解决这些问题:</p>
<p><strong>1。由于存在JavaScript或AJAX调用,无法单击元素</strong></p>
<p>尝试使用<code>Actions</code>类:</p>
<pre><code>WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
</code></pre>
<p><strong>2。无法单击元素,因为它不在<a href="https://www.w3schools.com/css/css_rwd_viewport.asp" rel="noreferrer">Viewport</a>内</strong></p>
<p>尝试使用<strong><code>JavascriptExecutor</code></strong>将元素带到视区中:</p>
<pre><code>WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);
</code></pre>
<p><strong>3。在元素可单击之前,页面正在刷新。</strong></p>
<p>在这种情况下,如第4点所述,诱导<em>解释方法</em>即<strong>WebDriverWait</strong>。</p>
<p><strong>4。元素存在于DOM中,但不可单击。</strong></p>
<p>在这种情况下,通过将<code>ExpectedConditions</code>设置为<code>elementToBeClickable</code>来诱导<em>ExplicitWait</em>使元素可单击:</p>
<pre><code>WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
</code></pre>
<p><strong>5。元素存在,但具有临时覆盖层。</strong></p>
<p>在这种情况下,将<strong><code>ExplicitWait</code></strong>设置为<strong><code>ExpectedConditions</code></strong>以使覆盖层不可见。</p>
<pre><code>WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
</code></pre>
<p><strong>6个。元素存在,但具有永久覆盖层。</strong></p>
<p>使用<code>JavascriptExecutor</code>直接在元素上发送单击。</p>
<pre><code>WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
</code></pre>