web-dev-qa-db-ja.com

「要素はポイントでクリックできません」というデバッグエラー

これはChromeでしか見られません。

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

"org.openqa.Selenium.WebDriverException:その時点で要素はクリックできません(411、675)。他の要素はクリックを受け取ります:..."

「クリックを受信する」要素は、問題の要素の横であり、その上ではなく、重ならず、ページ内を移動しません。

オフセットを追加しようとしましたが、それでもうまくいきません。項目は表示ウィンドウ上にあり、スクロールする必要はありません。

328
user1591169

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

それから要素をクリックしてください。

280

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

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

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

FreedomSponsors に多分賞金を置いてください)

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

43
Tony Lâmpada

私は同じ問題を抱えていて、すべての提供された解決策を試しましたが、それらは私のために働きませんでした。結局私はこれを使用しました:

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

お役に立てれば

31
XGillerX

私は、Selenium駆動のChromeウィンドウが小さすぎて開いていた状況でこれを見ました。クリックする要素がビューポートの外にあったため、失敗しました。

それは論理的に思えます...実際のユーザーは、要素を見て実際にそれをクリックすることができるようにウィンドウのサイズを変更するかスクロールする必要があります。

Seleniumドライバにウィンドウサイズを適切に設定するように指示した後、この問題は解決しました。 WebドライバAPIは ここ で記述されています。

16
opichals

うわー、ここにたくさんの答え、そしてたくさんの良い答え。

私は私の経験からこれに何かを追加すると思います。

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

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

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

15
Xwris Stoixeia

私もこの問題に取り組みました。コードはFFでは問題なく動作しますが、Chromeでは失敗します。私がやろうとしていたのは、チェックボックスをクリックすることでした - 表示されていない場合は、スクロールして表示してからクリックします。 Chromeでビューにスクロールインしても、チェックボックスの一番下の数ピクセルしか表示されていなかったので、ウェブドライバはクリックを拒否しました。

私の回避策はこれです:

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ハックより好んでいるので、他の誰かがそれを役に立つと思う場合に備えて、ここに投稿しています。

13
kolibri

Ruby/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")
13
Annet

Xvfb-runでヘッドレステストを実行すると、このエラーが発生していました。彼らは完璧に地元で働いていました。クロムを使用して、webdriver/chromedriver/chrome/Javaなどのバージョンはすべて同じです。

TonyLâmpada氏が指摘した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" ...
12
u-phoria

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

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

まず、最新のChromeドライバを入手して、問題が解決するかどうかを確認します。

私の場合、問題は解決しませんでした。しかし、次の解決策はこれまでのところ私のために働いた。以下はC#コードですが、あなたはあなたの特定の言語で同じ論理に従うことができます。私たちがここですることは、

ステップ1:Seleniumアクションオブジェクトを使用して要素に焦点を合わせます。

ステップ2:それから要素をクリックします

ステップ3:例外がある場合は、Seleniumブラウザドライバの "ExecuteScript"メソッドを介してjavascriptスクリプトを実行することによって、要素上のjavascript "Click"イベントをトリガします。

ステップ1と2をスキップして、ステップ3だけを試すこともできます。ステップ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();");

            }
8
Sujeewa

私はPythonでSeleniumスクリプトを実行中に同じ問題を抱えていました。これが私が要素をクリックするために使用したものです:

from Selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()
6
Prabhjot Rai

この方法は、TonyLâmpadaの回答からのコメントに基づいて作成しました。それはとてもうまくいきます。

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

私は同じようにerror.henceチェックボックスをチェックするための私のステップの間に待つことを追加しました....それはうまく機能し、素晴らしいです。手順は次のとおりです。 -

  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
5
Milind

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

私のために働いた1つの解決策(Our Mileage May Vary)は、この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'))

あなたがクリックしようとしている要素がリンクであるならば、私はこれがうまくいくと期待するでしょう...

4
alpheus

このエラーの原因は、クリックしようとしている要素がブラウザのビューポート(ユーザーから見た領域)にないことです。したがって、これを克服する方法は、最初に目的の要素までスクロールしてからクリックを実行することです。

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)')
}
3
sri

これは、ドライバがクリックしようとしている間に要素の位置が変わった場合に発生する可能性があります(私はこれを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;
});
3
Ohad Schneider

これを満たすのは、ロードダイアログがこの要素をカバーしているからです。 this要素を扱う前に、待ち時間を追加することで簡単に解決できます。

try {
        Thread.sleep((int) (3000));
    } catch (InterruptedException e) {
        //
        e.printStackTrace();
    }

この助けを願っています!

3
Huy Hóm Hỉnh

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))))
3
Jaime Agudo

エラーメッセージの説明

エラーメッセージは単にあなたがクリックしたい要素が存在することを示していますが、それは見えません。それは何かで覆われているか一時的に見えないかもしれません。

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

特定の場合の解決策

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

  • 素早い解決策 どのようにピンぼけを解消するには、画面の別の部分にある他の要素をクリックして、「何もしない」ことを行います。クリック操作の後は何も起こりません。
  • 適切な解決策 は、ツールチップをポップする要素に対してelement.blur()を呼び出すことで、ツールチップを消すことができます。
3
Dee

私は一種の強引なクリックをします、そしてそれは私のために働きます。

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
2
Super Mario

ページにjQueryがロードされている場合は、次のjavascriptコマンドを実行できます。

"$('#" + element_id + "').click()"

Python executorを使用した例

driver.execute_script("$('#%s').click()" % element_id)
2
Zags

すべての言及された提案をテストした後、何もうまくいきませんでした。私はこのコードを作りました。動作しますが、きれいではありません

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

それは面白いことです、私がさまざまな反応を見ている間ずっと、誰も明白なことを試したことはありませんでした。あなたのページが同じIDを複数回使用していて( "newButton"、)、欲しいものが最初に見つからなかった場合、おそらくこのエラーになるでしょう。最も簡単なこと(C#):

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

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

そして、検索結果から返される結果の数を確認します。それが2番目のものであるなら、あなたはそれから使うことができます:

testit[1].Click();

または、それらを修正するためにIDを再利用した誰かに取得してください。

2
CargoMeister

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

2
Steve Saporta

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

2
Dan Kohn

多分それは本当にきれいな解決策ではないが、それはうまくいく:

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
2
radeklos

Firefoxとrack_testではうまくいきましたが、ChromeとPoltergeistのfind_linkがEMタグとその中のテキストを含むAタグをクリックできないという別のバグがありました。解決策はclick_link(link)を次のように置き換えることでした。

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

ページのラジオボタンをクリックしようとしたときに同じ例外が発生しました。私は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);
1
JSDeveloper

の代わりに

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

私は2日間も同じ理由で立ち往生していました。実際には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)

それは本当にうまくいきました:)

1
Sanyam Gupta

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

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

1
mwikblom

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

1
Jim Sowers

私は同じ問題を抱えていました、そしてそれは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>
1
Jordan Silva

私は同じ問題を抱えており、解決策を見つけるのに何時間も費やしました。分度器を使って長い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)")
1
chfw

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

1
Code Silverback

JSでクリックをシミュレートすることができます。

public void click(WebElement element) {
    JavascriptExecutor js =(JavascriptExecutor)driver;
    js.executeScript("document.elementFromPoint(" + element.getLocation().x + "," + element.getLocation().y + ").click();");
}
1
AndreyP
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.<Id or anything>));

お役に立てれば。

0
Ayush Goel

その要素にフォーカスを合わせるかスクロールする必要があります。また、明示待機を使用する必要があるかもしれません。

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);
0
Shubham Jain

これは、WebdriverIOを使用している人に役立つ場合があります。

function(){
    var runInBrowser = function(argument) { 
        argument.click();
    };
    var elementToClickOn = browser.$('element');
    browser.execute(runInBrowser, elementToClickOn);
}

ソース: https://www.intricatecloud.io/2018/11/webdriverio-tips-element-wrapped-in-div-is-not-clickable/

0
web-auto-bot

私の場合、Firefoxでは機能しましたが、Chromeでは機能しませんでした。 Chromeでは、Chromeドライバのバージョンを最新に更新した後に修正されました。

0
Balram Singh

Rseleniumでは、リンクがウィンドウの上部の境界に配置されたときに何度も使用されたコードでこれが起こりました。簡単な解決策は次のようにsendKeysToElement()を使うことでした。

if (unlist(webElem$isElementDisplayed())) {
    webElem$sendKeysToElement(list(key = "up_arrow"))  # Add "up arrow"..
    webElem$clickElement()  # ... before $clickElement
0
Osprey Eagle

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

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

Conf.jsファイルで以下の行を使用している場合は、コメントアウトしてもう一度試してください。

browser.ignoreSynchronization = true;
0
rts

1024 x 768を超える解像度で作業しているときは、ブラウザを最大化するようにしてください。

driver.manage().window().maximize();
0
D.JCode