SeleniumWebドライバーとJava。要素は点(x、y)でクリックできません。他の要素はクリックを受け取ります


92

明示的な待機を使用しましたが、警告があります。

org.openqa.selenium.WebDriverException:要素はポイント(36、72)でクリックできません。他の要素はクリックを受け取ります:...コマンド期間またはタイムアウト:393ミリ秒

使用してThread.sleep(2000)も警告は表示されません。

@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    driver.findElement(By.id("navigationPageButton")).click();

    try {
       wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
    } catch (Exception e) {
        System.out.println("Oh");
    }
    driver.findElement(By.cssSelector(btnMenu)).click();
    Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}

Chromeバージョン61以降を使用していますか?
demouser123 2017

@ demouser123私はFirefox47.0.1とseleniumWebDriver2.51.0を使用しています
Maria

@Mariaどの行でエラーが発生していますか?ありがとう
DebanjanB 2017

@DebanjanBインライン:driver.findElement(By.id( "navigationPageButton"))。click();
マリア

このエラーは、ターゲット要素をオーバーレイする別の要素(固定/絶対配置オーバーレイ)があるか、z-indexが低すぎることを意味します。これは、トランジションを使用したホバー効果(最小タイムアウトより遅い、この場合は393ms)が原因である可能性があります。ボタンがクリック可能#navigationPageButtonになるように、表示される(またはelementToBeClickable()その要素を使用してクリック可能)まで待つか、すべての前提条件が満たされているかどうかを確認する必要があります。
try-catch-finally

回答:


194

WebDriverException:要素はポイント(x、y)でクリックできません

これは、java.lang.RuntimeExceptionを拡張する典型的なorg.openqa.selenium.WebDriverExceptionです

この例外のフィールドは次のとおりです。

  • BASE_SUPPORT_URLprotected static final java.lang.String BASE_SUPPORT_URL
  • DRIVER_INFOpublic static final java.lang.String DRIVER_INFO
  • SESSION_IDpublic static final java.lang.String SESSION_ID

個々のユースケースについては、エラーがすべてを物語っています。

WebDriverException: Element is not clickable at point (x, y). Other element would receive the click 

あなたが定義されていることをあなたのコードブロックから明らかなwaitようにWebDriverWait wait = new WebDriverWait(driver, 10);しかし、あなたは呼びかけているclick()前に、要素のメソッドをExplicitWaitのように場に出ますuntil(ExpectedConditions.elementToBeClickable)

解決

エラーElement is not clickable at point (x, y)はさまざまな要因から発生する可能性があります。次のいずれかの手順で対処できます。

1. JavaScriptまたはAJAX呼び出しが存在するため、要素がクリックされない

Actionsクラスを使用してみてください:

WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();

2.ビューポート内にないため、要素がクリックされない

を使用JavascriptExecutorして要素をビューポート内に移動してみてください。

WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 

3.要素がクリック可能になる前に、ページが更新されます。

この場合、ポイント4で説明したように、ExplicitWait、つまりWebDriverWaitを誘導します。

4.要素はDOMに存在しますが、クリックできません。

この場合、要素がクリック可能になるようにを設定してExplicitWaitを 誘導します。ExpectedConditionselementToBeClickable

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));

5.要素は存在しますが、一時的なオーバーレイがあります。

この場合、オーバーレイが非表示になるようにExplicitWaitをにExpectedConditions設定しinvisibilityOfElementLocatedて誘導し ます。

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

6.要素は存在しますが、永続的なオーバーレイがあります。

JavascriptExecutor要素に直接クリックを送信するために使用します。

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);

1
上記の#6 /#2へ:.ExecuteScriptメソッドは、JavascriptExecutorではなくWebドライバー自体からアクセスできるようになりました。よく書かれた答えをありがとう!
タブロック2018年

6
上記のエラーを処理する正しい方法が5と6だけである多くの可能性について説明しました。最初の4つは、指定したソリューションが機能しないさまざまなエラーをスローします。たとえば、ポイント番号3は実際には古い要素の問題であり、elementToBeClickbleメソッドでどれだけ待機しても機能しません。それは別の方法で処理する必要があります。
ラジャゴパラン2018

6は実際には正しくありません。問題を回避するためのハックです。正しい予想条件が使用されていれば、5は正しいでしょう。4が唯一の正解のように見えます。
アルデスコ

1
注意すべき重要な点は、ユーザーのアクションをエミュレートするときに、JavaScriptを使用してまったくクリックできない要素をクリックすることは非常に望ましくない場合があることです(#6)。エンドユーザーは決してそれを行いません。要素までスクロールしてビューポートに表示するか、オーバーレイを閉じて(ページで許可されている場合)操作します。
p_champ

18

Javascriptで使用する必要がある場合

引数[0] .click()を使用して、クリック操作をシミュレートできます。

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);

動作します!それがどのように機能するか想像できませんが、それ以外の場合はオーバーレイレイヤーをクリックします(「invisibilityOfElementLocated」によるオーバーレイが閉じるのを待つのに約30秒かかります)。
フィスク

私はジャワで書いているので、戦争はなじみがないので、完全な説明を書いていただけませんか?完全な流れを提供していただけますか?
バスティアン

4

いくつかの要素(またはそのオーバーレイ、私は気にしませんでした)をクリックしようとしたときにこのエラーが発生しましたが、他の答えはうまくいきませんでした。elementFromPointDOM APIを使用して修正し、代わりにSeleniumがクリックしてほしい要素を見つけました。

element_i_care_about = something()
loc = element_i_care_about.location
element_to_click = driver.execute_script(
    "return document.elementFromPoint(arguments[0], arguments[1]);",
    loc['x'],
    loc['y'])
element_to_click.click()

また、要素が移動している状況もありました。たとえば、ページ上でその上の要素がアニメーション化された展開または折りたたみを行っていたためです。その場合、このExpectedConditionクラスが役立ちました。クリックしたい要素ではなく、アニメーション化され要素を指定します。このバージョンは、jQueryアニメーションでのみ機能します。

class elements_not_to_be_animated(object):
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        try:
            elements = EC._find_elements(driver, self.locator)
            # :animated is an artificial jQuery selector for things that are
            # currently animated by jQuery.
            return driver.execute_script(
                'return !jQuery(arguments[0]).filter(":animated").length;',
                elements)
        except StaleElementReferenceException:
            return False

2

あなたが試すことができます

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();

それは私を助けません。
マリア

はい:org.openqa.selenium.WebDriverException:要素はポイント(36、72)でクリックできません。他の要素はクリックを受け取ります:<div tabindex = "0" class = "waiter-ui-lock"> </ div>コマンドの継続時間またはタイムアウト:70ミリ秒
Maria

1
次のことを試してくださいWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc 2017

それも助けにはなりません。2つの例外と1つのAssertionErrorがあり、次のエラー「要素はポイントでクリックできません」
Maria

1
Thread.Sleepを使用している場合は、すべて機能します。しかし、Waitallを使用すると失敗します。
マリア

2

例外で言及されているポイントの近くまでページをスクロールすることは私にとってトリックでした。以下はコードスニペットです。

$wd_host = 'http://localhost:4444/wd/hub';
$capabilities =
    [
        \WebDriverCapabilityType::BROWSER_NAME => 'chrome',
        \WebDriverCapabilityType::PROXY => [
            'proxyType' => 'manual',
            'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'noProxy' =>  PROXY_EXCEPTION // to run locally
        ],
    ];
$webDriver = \RemoteWebDriver::create($wd_host, $capabilities, 250000, 250000);
...........
...........
// Wait for 3 seconds
$webDriver->wait(3);
// Scrolls the page vertically by 70 pixels 
$webDriver->executeScript("window.scrollTo(0, 70);");

注:私はFacebook phpwebdriverを使用しています


0

最善の解決策は、クリック機能をオーバーライドすることです。

public void _click(WebElement element){
    boolean flag = false;
    while(true) {
        try{
            element.click();
            flag=true;
        }
        catch (Exception e){
            flag = false;
        }
        if(flag)
        {
            try{
                element.click();
            }
            catch (Exception e){
                System.out.printf("Element: " +element+ " has beed clicked, Selenium exception triggered: " + e.getMessage());
            }
            break;
        }
    }
}

0

C#では、チェックRadioButtonに問題がありましたが、これでうまくいきました。

driver.ExecuteJavaScript("arguments[0].checked=true", radio);

0

以下のコードで試すことができます

 WebDriverWait wait = new WebDriverWait(driver, 30);

他の要素を渡すとクリックが発生します<a class="navbar-brand" href="#"></a>

    boolean invisiable = wait.until(ExpectedConditions
            .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));

以下に示すように、クリック可能なボタンIDを渡します

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }

0

要素がクリックできず、オーバーレイの問題が発生している場合は、arguments [0] .click()を使用します。

WebElement ele = driver.findElement(By.xpath( "// div [@ class = 'input-group-btn'] / input")); JavascriptExecutor executor =(JavascriptExecutor)driver; executor.executeScript( "arguments [0] .click();"、ele);

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.