我尝试单击一个元素,但收到错误:
Element is not clickable at point (x,y.5)
因为另一个元素掩盖了它。
我已经尝试过先移动到该元素,然后单击,并通过最小化窗口然后单击来更改坐标,但这两种方法都失败了。可能重复的问题有我已经尝试过的答案,但没有一个对我有用。
此外,相同的代码可以在不同的电脑上运行。
如何解决?
这通常在
element.click()
不起作用时起作用:
element = driver.find_element_by_xpath(xpath)
driver.execute_script("arguments[0].click();", element)
您可能可以做一件事。虽然很粗鲁,但我马上就承认了。
您可以模拟单击所需元素之前的元素,然后模拟按 [TAB] 和 [ENTER] 键。
实际上,我最近就看到了这个错误。我使用的是裸硒提供的常用
.click()
命令 - 比如 driver.find_element_by_xpath(xpath).click()
。
我发现使用 ActionChains 解决了这个问题。
类似
ActionChains(driver).move_to_element(element).click().perform()
的东西对我有用。
您将需要:
from selenium.webdriver.common.action_chains import ActionChains
这是@wrecks的想法,但是如果使用php-webdriver,你可以使用下面的代码:
$element = $driver->findElement(WebDriverBy::cssSelector($id_login));
$driver->executeScript("arguments[0].click();", [$element]);
内部带有微调器的“正在加载”div 覆盖了我要单击的按钮。为了解决这个问题,我只是等到这个“正在加载”div 变得不可见。
这是一个小代码示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("url/to/visit")
# do some clicks or actions
# this "wait" can be reused
wait = WebDriverWait(self.driver, timeout=15)
# invisibility check
spinner = driver.find_element(
By.CSS_SELECTOR, ".spinnercontainer")
wait.until(EC.invisibility_of_element(spinner))
# click button
driver.find_element(
By.CSS_SELECTOR, ".fa-exchange").click()
这是此隐形检查的 Selenium 预期条件参考selenium.webdriver.support.expected_conditions.invisibility_of_element(元素)
等到按钮可单击检查元素是否不可见或不存在于 DOM 上的期望。 元素是定位器(文本)或 WebElement
在此实现之前,我尝试
,但它不起作用,因为无论按钮被此微调器遮挡,这些条件都满足。
selenium.webdriver.support.expected_conditions.element_to_be_clickable(标记)检查元素的期望是可见的并且已启用,以便您可以单击它。 元素是定位器(文本)或 WebElement
this.driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
IWebElement btnConsulter = driver.FindElement(By.Id("ctl00_contenuPrincipal_btnConsulter"));
this.driver.ExecuteJavaScript("arguments[0].click();", btnConsulter);
this.driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
/ Nerodia(selenium 的高级库)也遇到了同样的错误,这里有一个更优雅的解决方案,无需注入 JavaScript。 我的问题是,当用户第一次加载页面时,Jquery / JavaScript 触发了一个弹出窗口,并且遮盖了菜单中的链接。 所以解决办法是在点击链接之前关闭它。但是因为弹出窗口有淡入,所以我必须等待弹出窗口可见才能关闭它,并且因为弹出窗口有淡出,所以我必须等待链接不再被遮挡之前点击它。
所以代替:
b.link(visible_text: 'Log in').click
我有:
b.button(visible_text: 'Close').wait_until(&:visible?).click
b.link(visible_text: 'Log in').wait_while(&:obscured?).click
time.sleep(2)
。