442

これはChromeでのみ表示されます。

完全なエラーメッセージは次のとおりです。

"org.openqa.selenium.WebDriverException:要素はポイント(411、675)でクリックできません。他の要素はクリックを受け取ります:..."

「クリックを受け取る」要素は、問題の要素の横にあり、要素の上ではなく、重なり合っておらず、ページ内を移動していません。

オフセットを追加しようとしましたが、それも機能しません。アイテムは、スクロールせずに表示されたウィンドウに表示されます。

4

51 に答える 51

362

これは、次の 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));

次に、要素をクリックします。

于 2013-11-04T07:05:40.343 に答える
81

JavaScript のクリックとスクロールを使用することもできます。その場合、スクロールは必要ありません。

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
于 2014-04-02T10:26:06.177 に答える
50

そのためのchromedriverにバグがあるようです(問題は、修正されないとマークされていることです)-> GitHubリンク

(おそらくFreedomSponsorsに賞金をかけますか?)

コメント #27 で提案された回避策があります。多分それはあなたのために働くでしょう-

于 2012-10-02T13:34:05.170 に答える
38

私は同じ問題を抱えていて、提供されたすべての解決策を試しましたが、うまくいきませんでした。最終的に私はこれを使用しました:

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

お役に立てれば

于 2013-02-24T09:30:50.240 に答える
21

うわー、ここにはたくさんの答えがあり、多くの良い答えがあります。

これまでの経験から、少しでもプラスになれば幸いです。

皆さん、私の場合、時々要素を隠すCookieオーバーレイがありました。要素へのスクロールも機能します。しかし、私の謙虚な意見では (私の場合、万能薬ではありません)、最も簡単な解決策は全画面表示にすることです (私はスクリプトを画面ウィンドウの 3/4 で実行していました)! だからここに行きます:

driver.manage().window().maximize();

それが役立つことを願っています!

于 2016-08-25T14:54:46.290 に答える
16

その要素にフォーカスまたはスクロールを使用する必要があります。明示的な待機を使用する必要がある場合もあります。

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

また

要素の上にスピナー/オーバーレイがあるため、要素はクリックできません:

By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

また

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

また

それでも機能しない場合は使用してくださいJavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);
于 2019-06-09T07:35:03.977 に答える
12

私もこの問題に取り組みました。コードは 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 ハックよりもこれを好むので、他の誰かが役に立つと思う場合に備えてここに投稿します。

于 2013-11-14T13:34:29.360 に答える
12

ルビー/wadir-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")
于 2013-05-24T10:13:06.407 に答える
12

xvfb-run でヘッドレス テストを実行すると、このエラーが発生しました。彼らはローカルで問題なく動作していました。クロムを使用して、webdriver / chromedriver / chrome / java などのバージョンはすべて同一です。

chromedriver の「修正されない」バグ - Tony Lâmpada によって指摘されたGitHub リンクは、これが画面に表示されている/表示されていないものに関連している可能性があることを示唆しています。

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" ...
于 2015-02-18T12:24:30.213 に答える
10

まず、最新の 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();");

            }
于 2014-06-20T14:16:56.430 に答える
9

分度器を使用するとき、これは私を助けました:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();
于 2016-10-01T13:19:47.183 に答える
7

Tony Lâmpada's answer のコメントに基づいて、この方法を作成しました。それは非常にうまく機能します。

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end
于 2014-08-18T21:13:21.813 に答える
7

Pythonでセレンスクリプトを実行しているときに同じ問題が発生しました。要素をクリックするために使用したものは次のとおりです。

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()
于 2017-02-12T07:03:45.470 に答える
4

2つのチェックボックスを次々にチェックする必要があるときに同様の問題に直面していましたが、上記のエラーが同じでした。そのため、チェックボックスをチェックするための手順の間に待機を追加しました。手順は次のとおりです。-

  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
于 2012-12-26T07:32:08.583 に答える
3

どうやらこれは、Chrome ドライバー バイナリの "Won't Fix" バグの結果です。

私のために働いた1つの解決策(私たちのマイレージは異なる場合があります)は、このGoogleグループのディスカッション、コメント#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'))

ただし、クリックしようとしている要素がリンクの場合にのみ機能すると思います...

于 2013-02-05T16:37:49.280 に答える
3

これは、ドライバーが要素をクリックしようとしているときに要素の位置が変更された場合に発生する可能性があります (これは IE でも見られます)。ドライバーは初期位置を保持しますが、実際にクリックするまでに、その位置はその要素を指していません。ところで、FireFox ドライバーにはこの問題はありません。明らかに、プログラムで要素を「クリック」します。

とにかく、これは、アニメーションを使用したり、単に要素の高さを動的に変更したりするときに発生する可能性があります (例: $("#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;
});
于 2016-04-29T15:21:56.693 に答える
3

エラーメッセージの説明:

エラーメッセージは、クリックしたい要素が存在するが、表示されていないことを示しています。何かに覆われているか、一時的に見えない可能性があります。

テストの瞬間に要素が表示されない理由はたくさんあります。ページを再分析して、ケースに適した解決策を見つけてください。

特定のケースの解決策:

私の場合、このエラーは、クリックしたばかりの画面要素のツールチップが、次にクリックしたい要素の上に表示されたときに発生します。デフォーカスは私が必要としていた解決策でした。

  • 焦点をぼかす方法の簡単な解決策は、画面の別の部分にある他の要素をクリックして、「何もしない」ことです。クリック操作の後は何も起こりません。
  • 適切な解決策は、ツールヒントをポップする要素を呼び出すことelement.blur()です。これにより、ツールヒントが消えます。
于 2016-12-27T14:57:20.777 に答える
3

Tony Lâ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 では害はありませんでした。これらのブラウザーは問題の影響を受けませんが、要素をクリックする前に要素の位置までスクロールすることは、依然として悪いことではありません。

于 2014-04-24T16:14:51.830 に答える
2

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))))
于 2013-08-29T11:34:49.283 に答える
2

ホバーをテストしてから、ツールチップの下にあるリンクをクリックする必要があったため、このバグが発生していました。解決策は、ツールチップを邪魔にならないようにするpage.find('.sp-logo').hover前に追加することでした。click_link

于 2014-12-15T19:51:05.383 に答える
2

面白いことに、私はさまざまな回答を見て過ごしましたが、誰も明白なことを試していませんでした。もちろん、私も試していませんでした。私のページのように同じ ID が複数回使用されていて ("newButton")、必要な ID が最初に見つかった ID ではない場合、このエラーが発生する可能性が高くなります。最も簡単なこと (C#):

var testIt = driver.FindElements(By.Id("newButton"));

FindElement ではなく、FindElements であることに注意してください。

次に、検索から返された結果の数をテストします。2番目の場合は、次を使用できます。

testit[1].Click();

または、IDを再利用した人を入手して修正してください。

于 2015-05-19T18:23:37.597 に答える
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();
            }
        }
    }
}
于 2015-12-01T16:22:41.003 に答える
1

ページのラジオ ボタンの 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);
于 2015-06-17T14:52:00.837 に答える
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>
于 2013-02-21T08:16:34.327 に答える
1

私は同じ問題を抱えていて、表示されている可視要素に対して「他の要素がクリックを受け取る」というエラーが発生しました。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();"
);

そしてそれはすべてうまくいった

于 2014-04-10T09:52:36.053 に答える
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)")
于 2014-12-04T13:11:20.300 に答える
1

Visual Studio 2013 では、BrowserLink を有効にすると、画面の下部に BrowserLink ナビゲーション バーが表示されます。クリックしたいアイテムがそのナビゲーションバーの後ろにある場合、エラーが発生します。BrowserLink を無効にすると問題が解決しました。

于 2015-05-07T18:08:19.180 に答える
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";
        }
    });
}
于 2015-10-07T14:56:12.293 に答える
0

私は同じ問題に直面しており、遅延を使用しましたが、私の側ではうまく機能しています。ページが更新され、他のロケーターが取得されました。

Thread.sleep(2000);
        Click(By.xpath("//*[@id='instructions_container']/a"));
于 2015-03-16T16:51:41.653 に答える
0

私はこの問題に遭遇しましたが、(私の場合) クリックされた要素の前に div をポップする要素をクリックすることによって引き起こされたようです。これは、クリックを大きな 'ol try catch ブロックでラップすることで回避しました。

于 2013-04-30T18:48:28.390 に答える
0

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();
于 2013-07-30T13:42:03.060 に答える