我只在Chrome中看到这一点。
完整的错误消息显示为:
“org.openqa.selenium.WebDriverException:元素在点(411,675)处无法点击。其他元素将收到点击:...”
'会收到点击'的元素位于相关元素的一侧,而不是位于其上方且不重叠,不会在页面上移动。
我尝试过添加偏移量,但这也不起作用。该项目位于显示的窗口上,无需滚动。
答案 0 :(得分:282)
这是由以下3种类型引起的:
1.点击时无法看到该元素。
使用操作或 JavascriptExecutor 进行点击。
按行动:
WebElement element = driver.findElement(By("element_path"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();
通过JavascriptExecutor:
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("scroll(250, 0)"); // if the element is on top.
jse.executeScript("scroll(0, 250)"); // if the element is on bottom.
或
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].scrollIntoView()", Webelement);
然后点击元素。
2.页面在点击元素之前会刷新。
为此,请让页面等待几秒钟。
第3。该元素是可点击的,但顶部有一个微调/叠加
以下代码将等到叠加层消失
By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));
然后点击元素。
答案 1 :(得分:56)
您也可以使用JavaScript点击和滚动。
IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
答案 2 :(得分:43)
chromedriver中似乎有一个错误(问题是它被标记为无法修复) - > GitHub Link
(可能会在FreedomSponsors上放置一笔赏金?)
第27条评论中提出了一种解决方法。 也许这对你有用。
答案 3 :(得分:31)
我有同样的问题,尝试过所有提供的解决方案,但它们对我不起作用。 最后我用了这个:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));
希望这有帮助
答案 4 :(得分:16)
在硒驱动的Chrome窗口打开太小的情况下,我已经看到过这种情况。要单击的元素不在视口中,因此它失败了。
听起来合乎逻辑......真正的用户必须调整窗口大小或滚动才能看到元素并实际点击它。
在指示硒司机适当设置窗口大小后,这个问题就消失了。 webdriver API名称为here。
答案 5 :(得分:15)
我希望我能从我的经验中添加一些内容。
好吧,在我的情况下,偶尔有一个cookie覆盖隐藏元素。 滚动到元素也有效;但是以我的拙见(对我来说,并不是每个人的灵丹妙药)最简单的解决方案就是全屏(我在屏幕窗口的3/4上运行我的脚本)!所以我们走了:
driver.manage().window().maximize();
希望有所帮助!
答案 6 :(得分:13)
红宝石/的Watir-的webdriver /铬
我使用以下技巧,看起来很有效:
#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"
# click myelement
myelement.when_present.fire_event("click")
答案 7 :(得分:13)
我也和这个问题搏斗。代码在FF中工作正常,在Chrome上失败。我试图做的是点击一个复选框 - 如果它不在视图中,我滚动查看然后单击。即使滚动到视图在Chrome中工作,只有勾选框的底部几个像素不可见,因此webdriver拒绝单击它。
我的解决方法是:
WebElement element = _sectorPopup.findElement(...);
((Locatable) element).getCoordinates().inViewPort();
try {
element.click();
} catch (Exception e) {
new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
element.click();
}
Chrome也存在sendKeys问题,有时需要使用操作。显然,你需要知道你需要去哪个方向和多少,所以你的里程可能会有所不同。但我更喜欢这个javascript hack,所以我在这里发帖,以防其他人发现它有用。
答案 8 :(得分:12)
使用xvfb-run运行无头测试时出现此错误。他们在当地完美无瑕地工作。使用chrome,webdriver / chromedriver / chrome / java等版本完全相同。
chromedriver中的“无法修复”错误 - 托兰·兰帕达指出的GitHub Link暗示这可能与屏幕上显示的内容有关。
xvfb-run的帮助消息显示以下内容:
-s ARGS --server-args=ARGS arguments (other than server number and
"-nolisten tcp") to pass to the Xvfb server
(default: "-screen 0 640x480x8")
更改xvfb的分辨率会使错误消失:
xvfb-run -s "-screen 0 1280x1024x16" ...
答案 9 :(得分:9)
使用量角器时,这有助于我:
less.modifyVars({
'@BorderColor': '#5B83AD'
});
答案 10 :(得分:8)
首先,尝试获取最新的Chrome驱动程序并检查它是否解决了问题。
就我而言,它没有解决问题。但是,到目前为止,以下解决方案对我有用。以下是C#代码,但您可以按照特定语言使用相同的逻辑。我们在这里做的是,
步骤1:使用Selenium Actions对象
关注元素步骤2:然后点击元素
步骤3:如果有异常,那么我们通过Selenium浏览器驱动程序的“ExecuteScript”方法执行javascript脚本,在元素上触发javascript“Click”事件。
您也可以跳过第1步和第2步,也只尝试第3步。第3步可以自行运行,但我注意到在一个场景中出现了一些奇怪的行为,即使它成功点击了元素,步骤3在单击元素后在代码的其他部分引起了意外行为。
try
{
//Setup the driver and navigate to the web page...
var driver = new ChromeDriver("folder path to the Chrome driver");
driver.Navigate().GoToUrl("UrlToThePage");
//Find the element...
var element = driver.FindElement(By.Id("elementHtmlId"));
//Step 1
new Actions(driver).MoveToElement(element).Perform();
//Step 2
element.Click();
}
catch (Exception)
{
//Step 3
driver.ExecuteScript("document.getElementById('elementHtmlId').click();");
}
答案 11 :(得分:7)
我根据TonyLâmpada的回答发表了这个方法。它工作得很好。
def scroll_to(element)
page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end
答案 12 :(得分:6)
我在python中运行selenium脚本时遇到了同样的问题。这是我以前单击元素的内容:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).click(element).perform()
答案 13 :(得分:5)
我遇到了类似的问题,我必须一个接一个地检查两个复选框。但是我得到了相同的上述错误。因此我在检查复选框的步骤之间添加等待....其工作正常和伟大的步骤: -
When I visit /administrator/user_profiles
And I press xpath link "//*[@id='1']"
Then I should see "Please wait for a moment..."
When I wait for 5 seconds
And I press xpath link "//*[@id='2']"
Then I should see "Please wait for a moment..."
When I visit /administrator/user_profiles_updates
答案 14 :(得分:4)
显然,这是Chrome驱动程序二进制文件中“无法修复”错误的结果。
一个对我有用的解决方案(我们的里程可能会发生变化)可以在Google Group讨论中找到,评论#3:
https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc
相关部分就在这里:
我已经解决了这个问题,直接导航到了href 跨度的父锚。
driver.Navigate()GoToUrl(driver.FindElement(By.Id(embeddedSpanIdToClick))FindElement(By.XPath( “.. ”))的getAttribute(的“ href”)。);
在我的情况下,我正在使用Python,所以一旦我得到了所需的元素,我只需使用
driver.get(ViewElm.get_attribute('href'))
但是,如果您尝试点击的元素是链接,我希望这只能起作用...
答案 15 :(得分:3)
此错误的原因是您尝试单击的元素不在浏览器的视口(用户看到的区域)中。因此,克服此问题的方法是先滚动到所需的元素,然后执行单击。
Javascript:
async scrollTo (webElement) {
await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
await this.driver.executeScript('window.scrollBy(0,-150)')
}
Java:
public void scrollTo (WebElement e) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
js.executeAsyncScript('window.scrollBy(0,-150)')
}
答案 16 :(得分:3)
如果元素在驱动程序尝试单击时更改位置,则可能会发生这种情况(我也已经通过IE看到了这一点)。驱动程序保留初始位置,但是当它实际点击它时,该位置不再指向该元素。 FireFox驱动程序没有这个问题BTW,显然它点击了"元素编程。
无论如何,当您使用动画或只是动态更改元素的高度(例如$("#foo").height(500)
)时,就会发生这种情况。你需要确保只有在他们的身高已经确定并且#34;之后才点击元素。我最终得到了这样的代码(C#bindings):
if (!(driver is FirefoxDriver))
{
new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}
如果是动画或任何其他因素,您无法轻易查询,您可以使用"泛型"等待元素静止的方法:
var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d =>
{
var e = driver.FindElement(By.Id(someId));
if (e.Location == prevLocation)
{
stationaryCount++;
return stationaryCount == desiredStationarySamples;
}
prevLocation = e.Location;
stationaryCount = 0;
return false;
});
答案 17 :(得分:3)
我遇到了这个,因为这个元素上有一个加载对话框。我通过在使用this元素之前添加一个等待来简单地解决它。
try {
Thread.sleep((int) (3000));
} catch (InterruptedException e) {
//
e.printStackTrace();
}
希望这有帮助!
答案 18 :(得分:3)
错误消息说明:
错误消息只是说,您要单击的元素存在,但它不可见。它可能被某些东西覆盖或暂时不可见。
可能有很多原因导致元素在测试时刻不可见。请重新分析您的页面并找到适合您案例的解决方案。
特定案例的解决方案:
在我的情况下,当我刚刚点击的屏幕元素的工具提示弹出我想要点击的元素时,会发生此错误。 散焦是我需要的解决方案。
element.blur()
,这会使工具提示消失。 答案 19 :(得分:3)
我在clj-webdriver(Selenium的clojure端口)遇到了同样的问题。为了方便起见,我刚才将之前的解决方案翻译成了clojure。您可以在执行单击或其他任何操作之前调用此函数以避免该问题。
(defn scrollTo
"Scrolls to the position of the given css selector if found"
[q]
(if (exists? q)
(let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ]
(execute-script jscript))))
答案 20 :(得分:2)
我收到此错误是因为我测试了悬停,然后需要点击工具提示下方的链接。解决方案是在page.find('.sp-logo').hover
之前添加click_link
以使工具提示无法使用。
答案 21 :(得分:2)
如果您在页面上加载了jQuery
,则可以执行以下javascript命令:
"$('#" + element_id + "').click()"
使用python执行器的示例:
driver.execute_script("$('#%s').click()" % element_id)
答案 22 :(得分:2)
我做了一种蛮力的点击,它对我有用。
try:
elem.click()
except:
print "failed to click"
size = elem.size
mid_of_y = int(size["height"])/2
stepts_to_do_to_left = int(size["width"])
while stepts_to_do_to_left > 0:
try:
print stepts_to_do_to_left, mid_of_y
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
action.click()
action.perform()
print "DONE CLICK"
break
except:
pass
答案 23 :(得分:2)
这很有趣,我一直在寻找各种各样的反应,没有人尝试过明显的,当然,我也没有。如果您的页面具有多次使用的相同ID,正如我所做的那样(“newButton”),并且您想要的那个不是第一个找到的,那么您很可能会遇到此错误。最简单的事情(C#):
onSearchRequest
注意它是FindElements,而不是FindElement。
然后测试以查看从检索中返回了多少结果。如果是第二个,您可以使用:
var testIt = driver.FindElements(By.Id("newButton"));
或者让任何重复使用的id来修复它们。
答案 24 :(得分:2)
也许这不是真正干净的解决方案,但它有效:
try:
el.click()
except WebDriverException as e:
if 'Element is not clickable at point' in e.msg:
self.browser.execute_script(
'$("{sel}").click()'.format(sel=el_selector)
)
else:
raise
答案 25 :(得分:2)
在测试了所有提到的建议后,没有任何效果。我做了这个代码。它有效但不漂亮
public void click(WebElement element) {
//https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
while(true){
try{
element.click();
break;
}catch (Throwable e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
public void click(String css) {
//https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
while(true){
try{
driver.findElement(By.cssSelector(css)).click();
break;
}catch (Throwable e){
try {
Thread.sleep(200);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
答案 26 :(得分:2)
回到TonyLâmpada的回答,评论#27确实为我解决了问题,除了它提供了Java代码,我需要Python。这是一个Python函数,它滚动到元素的位置,然后单击它。
def scroll_to_and_click(xpath):
element = TestUtil.driver.find_element_by_xpath(xpath)
TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
element.click()
这解决了我在Chrome 34.0中遇到的问题。它对Firefox 28.0和IE 11没有任何伤害;那些浏览器不会遇到问题,但在点击它之前滚动到元素的位置仍然不是坏事。
答案 27 :(得分:1)
由于同样的原因,我也被困了两天,实际上Scrolling可以使它工作,因为可能无法正确加载数据,这可能一次又一次地导致相同的错误。
我所做的是,我随机向下滚动一次,依次是(0,-500),然后是(0,400),然后是(0.-600),您可以根据自己的用途提供这些滚动值。只需将其滚动到要单击内容的位置即可。
driver.execute_script("scrollBy(0,-500);")
sleep(5)
driver.execute_script("scrollBy(0,400);")
sleep(5)
driver.execute_script("scrollBy(0,-600);")
sleep(5)
它确实有效:)
答案 28 :(得分:1)
如果您在使用模态(弹出窗口)时遇到此问题,请注意,当前顶层模态下可能存在另一个具有相同属性的元素。这吸引了我,只是增加选择器的特异性,以将范围缩小到仅尝试单击的模式的范围。
答案 29 :(得分:1)
我在单击 Angular Material 菜单中的按钮时遇到了这个确切的问题。每当我点击菜单内的按钮时,.cdk-overlay-pane
都会收到点击。解决方法是增加菜单内按钮的z-index
。
.cdk-overlay-pane button {
z-index: 1001;
}
答案 30 :(得分:1)
我在尝试点击页面上的某个单选按钮时遇到了同样的异常。我使用下面的Javascript并使用IJavaScriptExecutor执行。 C#示例
string script=" function clickCharity() {"+
"var InputElements = document.getElementsByName('Charity');"+
"for (i=0; i<InputElements.length; i++){"+
"if(InputElements[i].getAttribute('value') == 'true')"+
"{"+
"InputElements[i].click();"+
"}"+
"}"+
"}";
var js=WebDriver as IJavaScriptExecutor;
js.ExecuteScript(script);
答案 31 :(得分:1)
您可以使用JS模拟点击:
public void click(WebElement element) {
JavascriptExecutor js =(JavascriptExecutor)driver;
js.executeScript("document.elementFromPoint(" + element.getLocation().x + "," + element.getLocation().y + ").click();");
}
答案 32 :(得分:1)
我有同样的问题,它是由div和div内部的链接之间的ID冲突引起的。所以司机点击了div而不是我想要的链接。 我更改了div id并且它正常工作。
在:
<div id="logout"><a id="logout" href="logoutLink">logout</a></div>
后:
<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>
答案 33 :(得分:1)
我遇到了这个问题,它似乎是由(在我的情况下)通过单击在单击元素前面弹出div的元素引起的。我通过将我的点击包裹在一个大的'尝试捕获块'中解决了这个问题。
答案 34 :(得分:1)
在Drupal中使用Selenium:
// Get element.
$element = $this->driver->getElement('xpath=//input');
// Get screen location.
$location = $element->getLocation();
// To make sure that Chrome correctly handles clicking on the elements
// outside of the screen, we must move the cursor to the element's location.
$this->driver->moveCursor($location['x'], $location['y']);
// Optionally, set some sleep time (0.5 sec in the example below) if your
// elements are visible after some animation.
time_nanosleep(0, 500000000);
// Click on the element.
$element->click();
答案 35 :(得分:1)
我遇到了同样的问题,并且“其他元素”会收到点击次数&#39;显示的可见元素的错误。我找不到用javascript触发点击的其他解决方案。
我换了:
WebElement el = webDriver.findElement(By.id("undo-alert"));
WebElement closeButton = el.findElement(By.className("close"));
// The following throws 'Element is not clickable at point ... Other element
// would receive the click'
closeButton.click();
使用:
((JavascriptExecutor) webDriver).executeScript(
"$('#undo-alert').find('.close').click();"
);
这一切都很顺利
答案 36 :(得分:1)
我遇到了同样的问题,花了好几个小时才找到解决方案。我尝试使用量角器单击长ngGrid底部的单元格。这是我的ngGrid html的快照:
....many rows here..
<!- row in renderedRows ->
<!- column in renderedColumns ->
<div ...> <a ngclick="selectRow(row)"...>the test link 100000</a>...
....
所有点击功能都不起作用。解决方案是在元素的当前范围中使用evaluate:
element(by.cssContainingText("a", "the test link 100000"))
.evaluate("selectRow(row)")
答案 37 :(得分:1)
我还有另一个错误,Chrome和Poltergeist上的find_link
无法点击带有EM标签的A标签及其中的一些文字,尽管它在Firefox和rack_test中运行良好。解决方案是将click_link(link)
替换为:
find('a em', text: link).click
答案 38 :(得分:1)
在Visual Studio 2013中,如果启用BrowserLink,它会在屏幕底部显示BrowserLink导航栏。如果要单击的项目位于该导航栏后面,则会显示错误。禁用BrowserLink解决了我的问题。
答案 39 :(得分:1)
而不是
webdriver.findElement(By.id("id1")).click();
尝试使用
click(By.id("id1"));
void click(final By byLocator) {
waitFor(new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
WebElement element = driver.findElement(byLocator);
if (element.isDisplayed()) {
try {
element.click();
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
@Override
public String toString() {
return "Element located " + byLocator + " clicked";
}
});
}
答案 40 :(得分:0)
就我而言,它在Firefox中有效但在Chrome中失败了。在Chrome中,在将Chrome驱动程序版本更新为最新版本后,它已得到修复。
答案 41 :(得分:0)
在Rselenium中,当链接位于顶部窗口边界时,代码成功使用了很多次。简单的解决方案是使用sendKeysToElement(),如下所示。
if (unlist(webElem$isElementDisplayed())) {
webElem$sendKeysToElement(list(key = "up_arrow")) # Add "up arrow"..
webElem$clickElement() # ... before $clickElement
答案 42 :(得分:0)
我面临着同样的问题而且我使用了延迟,而且我的工作正常。页面正在刷新并获得其他定位器。
Thread.sleep(2000);
Click(By.xpath("//*[@id='instructions_container']/a"));
答案 43 :(得分:0)
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.<Id or anything>));
希望这会有所帮助。
答案 44 :(得分:0)
在使用大于1024x768的分辨率时,请尝试最大化浏览器。
print (struct.pack('>h',a))
答案 45 :(得分:0)
您需要在该元素上使用焦点或滚动。您可能还必须使用显式等待。
WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();
OR
由于元素上方有一个微调器/叠加层,因此该元素不可点击:
By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));
OR
Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();
OR
如果仍然无法使用,请使用JavascriptExecutor
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);
答案 46 :(得分:0)
这可能会对使用WebdriverIO的人有所帮助:
function(){
var runInBrowser = function(argument) {
argument.click();
};
var elementToClickOn = browser.$('element');
browser.execute(runInBrowser, elementToClickOn);
}
来源:decimal
答案 47 :(得分:0)
如果您在conf.js文件中使用以下行,请将其评论并重试
browser.ignoreSynchronization = true;
答案 48 :(得分:0)
如果您尝试点击 input
或 button
的 disabled
,也可能发生这种情况,在这种情况下,没有任何内容与元素重叠,但无法点击。>
答案 49 :(得分:0)
可能有很多因素会引发此错误。 首先,可能是在selenium webdriver捕获元素后改变了dom,或者在捕获元素之前没有成功加载元素中使用的所有java脚本。 要解决这个问题,我们需要使用 javascript 等待或 ajax 等待,如下所示。
wait = new WebDriverWait(driver, 30);
wait.until((ExpectedCondition<Boolean>) wd -> ((JavascriptExecutor) wd).executeScript("return document.readyState").equals("complete"));
e_driver = new EventFiringWebDriver(driver);
其次,大多数提供软件质量保证服务的公司的工程师都尝试使用java script executor进行点击操作。
如果这也不起作用,则使用 Actions 类执行操作。
答案 50 :(得分:0)
今天我遇到了同样的问题。如果我说我是如何解决这个问题的,你不相信我。
$ helm install project1 prometheus-community/kube-prometheus-stack
$ helm install project2 prometheus-community/kube-prometheus-stack
是的,这是一个指针问题,表示浏览器的大小。为此,您只需要手动或通过代码最大化窗口大小。
答案 51 :(得分:-2)
如果您使用Python:
from selenium import webdriver
action = webdriver.ActionChains(driver=self.driver)
action.move_to_element(to_element=self.driver.find_element_by_xpath(xpath="[xpath]"))
action.click()
action.perform()