ボタンをクリックするには、要素が表示されているビューポートにスライドするのを待つ必要があります。これは確実に機能します:
await browser.sleep( 1200 );
await btnToggleDeactivateQuestionnaire.click();
ただし、「browser.sleep()」の使用は悪い習慣と見なされることを知ったので、分度器のExpectedConditionsを使用してこれを達成したいと考えています。
let isPresent = EC.presenceOf(btnToggleDeactivateQuestionnaire);
let isVisible = EC.visibilityOf(btnToggleDeactivateQuestionnaire);
let isClickable = EC.elementToBeClickable(btnToggleDeactivateQuestionnaire);
let isPresentAndVisibleAndClickable = EC.and(isPresent, isVisible, isClickable);
await browser.wait(isPresentAndVisibleAndClickable, 4000);
await btnToggleDeactivateQuestionnaire.click();
4 秒待った後、次のエラーが表示されます。
Failed: Wait timed out after 4019ms
TimeoutError: Wait timed out after 4019ms
at C:\xxx\lib\promise.js:2201:17
at runMicrotasks (<anonymous>)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
多くの試行錯誤の後、「EC.presenceOf」のみを使用するとうまくいくことがわかりました。ただし、「EC.visibilityOf」または「EC.elementToBeClickable」でチェーンするか、いずれかを単独で使用するとすぐに、テストは 4 秒間停止し、その時点で失敗します。
私には、その振る舞いはまったく意味がないように思えます。特に、その要素はページが読み込まれてから存在するため、表示されておらず、まだクリック可能です (最初にスライドして表示する必要があるため)。
ExpectedConditions の一般的な理解、または角度のないサイトでの動作は間違っていますか? ここで何が欠けていますか?