调试“元素不可点击”错误

oillo 发布于 2019-01-27 selenium 最后更新 2019-01-27 08:36 92 浏览

我只在Chrome中看到这一点。 完整的错误信息如下所示:

"org.openqa.selenium.WebDriverException: Element is not clickable at point (411, 675). Other element would receive the click: ..."
'会接受点击'的元素位于所讨论的元素的侧面,而不是在它的顶部,不与其重叠,而不是在页面上移动。 我尝试添加偏移量,但这也不起作用。该项目在显示的窗口上,不需要滚动。
已邀请:

sesse

赞同来自:

我做了一种蛮力的点击,它对我有用。

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

dipsam

赞同来自:

我面临同样的问题,我使用了延迟,它在我身边工作得很好。页面正在刷新并获得其他定位器。

Thread.sleep(2000);
        Click(By.xpath("//*[@id='instructions_container']/a"));

umodi

赞同来自:

我得到了这个bug,因为我测试了一个悬停,然后需要点击工具提示下面的链接。解决方案是在click_link之前添加page.find('.sp-logo').hover以使工具提示不受影响。

jsed

赞同来自:

我面临一个类似的问题,我必须一个接一个地检查两个复选框。但我得到相同的上述错误。因此我在我的步骤之间添加等待检查复选框....它的工作正常和伟大。以下是步骤: -

  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

nsequi

赞同来自:

在测试了所有提到的建议之后,没有任我做了这个代码。它有效,但并不美观

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();
            }
        }
    }
}

tiure

赞同来自:

我遇到了与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))))

xipsam

赞同来自:

也许这不是真正干净的解决方案,但它有效:

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

aeius

赞同来自:

我遇到了这个,因为这个元素上有一个加载对话框。我通过在使用this元素之前添加一个等待来简单地解决它。

try {
        Thread.sleep((int) (3000));
    } catch (InterruptedException e) {
        //
        e.printStackTrace();
    }
希望这有帮助!

lenim

赞同来自:

我在python中运行selenium脚本时遇到了同样的问题。这是我以前点击元素:

from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).click(element).perform()

fet

赞同来自:

使用xvfb-run运行无头测试时出现此错误。他们在当地完美无瑕地工作。使用chrome,webdriver / chromedriver / chrome / java等版本都相同。 TonyLâmpada指出,chromedriver中的“不会修复”错误 - http://code.google.com/p/selenium/issues/detail?id=2766表明这可能与屏幕上显示的内容有关。 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" ...

ysunt

赞同来自:

由于selenium jar,这种情况多次发生。将jar文件更改为更新的jar文件。 再试一次。它应该工作

wqui

赞同来自:

这很有趣,我一直在寻找各种各样的反应,没有人尝试过明显的,当然,我也没有。如果您的页面具有多次使用的相同ID,正如我所做的那样(“newButton”)和您想要的那个不是第一个找到的,那么您很可能会遇到此错误。最简单的事情(C#):

var testIt = driver.FindElements(By.Id("newButton"));
注意它是FindElements,而不是FindElement。 然后测试以查看从检索中返回的结果数量。如果是第二个,您可以使用:
testit[1].Click();
或者让任何重用的id来修复它们。

lsint

赞同来自:

显然,这是Chrome驱动程序二进制文件中“无法修复”错误的结果。 一个对我有用的解决方案(我们的里程可能会变化)可以在Google Group讨论中找到,评论#3: https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc 相关部分就在这里:

I've since worked around the issue by navigating directly to the href of the parent anchor of the span. driver.Navigate().GoToUrl(driver.FindElement(By.Id(embeddedSpanIdToClick)).FindElement(By.XPath("..")).GetAttribute("href"));
就我而言,我正在使用Python,所以一旦我得到了所需的元素,我就会使用它
driver.get(ViewElm.get_attribute('href'))
我希望这只能起作用,但是,如果您要点击的元素是链接...

eipsum

赞同来自:

我也和这个问题搏斗了。代码在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问题,有时需要使用Actions。显然,你需要知道你需要去哪个方向和多少,所以你的里程可能会有所不同。但我更喜欢这个javascript hack,所以我在这里发布它,以防其他人发现它有用。

msed

赞同来自:

哇,这里有很多答案,还有很多好的答案。 我希望我能从我的经验中加入一些东西。 好吧,在我的情况下,偶尔有一个cookie叠加隐藏元素。 滚动到元素也有效;但是以我的拙见(对我的情况来说,并不是每个人的灵丹妙药)最简单的解决方案就是全屏(我在屏幕窗口的3/4上运行我的脚本)!所以我们走了:

driver.manage().window().maximize();
希望有所帮助!

funde

赞同来自:

chromedriver似乎有一个错误(问题是它被标记为无法修复)

bsint

赞同来自:

你可以用JS模拟点击:

public void click(WebElement element) {
    JavascriptExecutor js =(JavascriptExecutor)driver;
    js.executeScript("document.elementFromPoint(" + element.getLocation().x + "," + element.getLocation().y + ").click();");
}

taut

赞同来自:

红宝石/的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")

frerum

赞同来自:

我根据TonyLâmpada的回答发表了这个方法。它工作得很好。

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end

ab_non

赞同来自:

我有同样的问题,尝试了所有提供的解决方案,但他们没有为我工作。 最后我用这个:

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));
希望这可以帮助

rqui

赞同来自:

我有同样的问题,它是由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>

jquia

赞同来自:

就我而言,它在Firefox中有效但在Chrome中失败了。在Chrome中,将Chrome驱动程序版本更新为最新版本后,它已修复。

modit

赞同来自:

回答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中没有造成任何伤害;那些浏览器不会遇到问题,但在点击它之前滚动到元素的位置仍然不是一件坏事。

veos

赞同来自:

我遇到了这个问题,它似乎是由(在我的情况下)通过单击在单击元素前面弹出div的元素引起的。我通过将我的点击包裹在一个很大的'尝试捕捉块'中解决了这个问题。

fharum

赞同来自:

如果您在页面上加载了jQuery,则可以执行以下javascript命令:

"$('#" + element_id + "').click()"
使用python执行程序的示例:
driver.execute_script("$('#%s').click()" % element_id)

mut

赞同来自:

如果您使用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()

id_aut

赞同来自:

代替

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";
        }
    });
}

gnihil

赞同来自:

我有同样的问题,并为显示的可见元素得到'其他元素将收到点击'错误​​。我找不到用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();"
);
这一切都很好

taut

赞同来自:

在Visual Studio 2013中,如果启用BrowserLink,它将在屏幕底部显示BrowserLink导航栏。如果要单击的项目位于该导航栏后面,则会显示错误。禁用BrowserLink解决了我的问题。

godio

赞同来自:

这是由以下3种类型引起的: 1.单击时无法看到该元素。 使用Actions或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));
然后单击元素。

west

赞同来自:

使用量角器时,这有助于我:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();

xsint

赞同来自:

在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();

dsit

赞同来自:

尝试单击页面上的某个单选按钮时,我遇到了同样的异常。我使用下面的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);

et_et

赞同来自:

如果元素在驱动程序尝试单击时更改位置,则可能会发生这种情况(我也在IE中看到过这种情况)。驱动程序保留初始位置,但是当它实际点击它时,该位置不再指向该元素。 FireFox驱动程序没有这个问题BTW,显然它以编程方式“点击”元素。 无论如何,当您使用动画或仅动态更改元素的高度(例如$("#foo").height(500))时,可能会发生这种情况。您需要确保在高度“已结算”后才单击元素。我最终得到了这样的代码(C#绑定):

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;
});

wiusto

赞同来自:

您也可以使用JavaScript点击和滚动当时不需要。

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);

gminus

赞同来自:

首先,尝试获取最新的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();");
}

snihil

赞同来自:

错误消息的说明: 错误消息只是说,您要单击的元素存在,但它不可见。它可能被某些东西覆盖或暂时不可见。 可能有许多原因导致元素在测试时刻不可见。请重新分析您的页面并找到适合您案例的解决方案。 特定案例的解决方案: 在我的情况下,当我刚刚点击的屏幕元素的工具提示弹出我想要点击的元素时,会发生此错误。散焦是我需要的解决方案。

  • 快速解决方法如何散焦将是点击屏幕另一部分的其他部分,其中“无”。点击操作后没有任何反应。
  • 正确的解决方案是在弹出工具提示的元素上调用element.blur(),这会使工具提示消失。

set

赞同来自:

在硒驱动的Chrome窗口打开太小的情况下,我已经看到过这种情况。要单击的元素不在视口中,因此失败。 这听起来合乎逻辑......真正的用户必须调整窗口大小或滚动才能看到元素并实际点击它。 在指示硒司机适当设置窗口大小后,这个问题就消失了。 webdriver API描述为here

ddolor

赞同来自:

我有另一个错误,Chrome和Poltergeist上的find_link无法单击带有EM标签的A标签及其中的一些文本,尽管它在Firefox和rack_test中运行良好。解决方案是将click_link(link)替换为:

find('a em', text: link).click

ksequi

赞同来自:

我遇到了同样的问题,花了好几个小时才找到解决方案。我尝试使用量角器单击长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)")

aeius

赞同来自:

如果您在conf.js文件中使用以下行,请将其评论出来并重试

browser.ignoreSynchronization = true;