Java

SeleniumとChromeDriverでorg.openqa.selenium.ElementClickInterceptedException 〜is not clickable at point (*,*). が発生 – 回避策

Seleniumを使ったコードで以下の例外が発生しました。使っているのはSelenium 3.141.59とChromeDriver 80.0.3987.106。

Caused by: org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element ... is not clickable at point (729, 567). Other element would receive the click:  (Session info: headless chrome=80.0.3987.149) Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03' System info: host: 'yMacBookPro-2.local', ip: 'fe80:0:0:0:402:c46:36ca:8edb%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.15.4', java.version: '1.8.0_222' Driver info: org.openqa.selenium.chrome.ChromeDriver Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 80.0.3987.149, chrome: {chromedriverVersion: 80.0.3987.106 (f68069574609..., userDataDir: /var/folders/l8/12l3_q6x5c9...}, goog:chromeOptions: {debuggerAddress: localhost:58203}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: MAC, platformName: MAC, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify} Session ID: 79412a929418808a9302dd5170d54ce5 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187) at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122) at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49) at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158) at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83) at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552) at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:285) at org.openqa.selenium.remote.RemoteWebElement.click(RemoteWebElement.java:84)

例外を発生させているコードは、要素を見つけてクリックイベントを発生させています。

chosenItem.findElement(By.className("buy-btn")).click();

手元で動かすと正常動作するのに、CIは失敗する。調べてみるとheadlessで動かしている時だけ失敗することが分かりました。
例外発生時にスクリーンショットも撮っているので、見てみるとウインドウサイズが1600×1200と少し小さめで、当該ボタンが画面に表示されていません。
最大化時の画面サイズがChromeのバージョンで小さくなったのかも?

以下のように window-size オプションを付けて画面サイズを増やしたらまた動くようになりました。

if (GlobalProp.getBooleanProperty("chrome.ForceHeadless") || headless) {
    options.addArguments("--headless");
    // https://stackoverflow.com/questions/48450594/selenium-timed-out-receiving-message-from-renderer
    options.addArguments("--window-size=1920,1080");
    options.addArguments("--start-maximized"); // https://stackoverflow.com/a/26283818/1689770
    options.addArguments("--enable-automation"); // https://stackoverflow.com/a/43840128/1689770
    options.addArguments("--no-sandbox"); //https://stackoverflow.com/a/50725918/1689770
    options.addArguments("--disable-infobars"); //https://stackoverflow.com/a/43840128/1689770
    options.addArguments("--disable-dev-shm-usage"); //https://stackoverflow.com/a/50725918/1689770
    options.addArguments("--disable-browser-side-navigation"); //https://stackoverflow.com/a/49123152/1689770
    options.addArguments("--disable-gpu"); //https://stackoverflow.com/questions/51959986/how-to-solve-selenium-chromedriver-timed-out-receiving-message-from-renderer-exc
}