🐕

[AWS]CloudWatch Syntheticsでtarget=”_blank”属性のGUI外形監視をする

2024/07/27に公開

概要

  • GUI ワークフロービルダーを使用した外形監視を実施
  • target=”_blank”属性のためスクリーンショットが正確に保存されない
  • element not interactable が発生

外形監視サイト概要(テストページ)

CloudWatch Syntheticsの設定

表に記載していない項目はデフォルト設定を利用した。

項目
設計図 GUI ワークフロービルダー
アクション クリック
セレクター //*[@id="GoogleBtn"]/a (XPATH)
ランタイムバージョン syn-python-selenium-3.0

セレクターで記載した箇所はcustomer_actions_1で作成される。

def customer_actions_1():
        browser.find_element(By.XPATH, "//*[@id='GoogleBtn']/a").click()

全体は下記

Code
import asyncio
from selenium.webdriver.common.by import By
from aws_synthetics.selenium import synthetics_webdriver as syn_webdriver
from aws_synthetics.common import synthetics_logger as logger, synthetics_configuration

TIMEOUT = 10

async def main():
    url = "http://sandbox42.xerga.net/"
    browser = syn_webdriver.Chrome()


    # Set synthetics configuration
    synthetics_configuration.set_config({
       "screenshot_on_step_start" : True,
       "screenshot_on_step_success": True,
       "screenshot_on_step_failure": True
    });


    def navigate_to_page():
        browser.implicitly_wait(TIMEOUT)
        browser.get(url)

    await syn_webdriver.execute_step("navigateToUrl", navigate_to_page)

    # Execute customer steps
    def customer_actions_1():
        browser.find_element(By.XPATH, "//*[@id='GoogleBtn']/a").click()

    await syn_webdriver.execute_step('click', customer_actions_1)

    logger.info("Canary successfully executed.")

async def handler(event, context):
    # user defined log statements using synthetics_logger
    logger.info("Selenium Python workflow canary.")
    return await main()

結果

事象1

Message: element not interactable が表示され、失敗。

原因は正直なところ不明…
下記内容がネット上にはあるが、今回は該当せず

  • 要素が表示されていない
  • nameが複数
  • DOMが動的に生成されている
  • 要素選択が違う

onclick="ga('send', 'event', 'link', 'click'); が悪さをしているという予想の元
JacaScriptでクリックするようにコードを変更することで対応した。

def customer_actions_1():
        element = browser.find_element(By.XPATH, "//*[@id='GoogleBtn']/a")
        browser.execute_script("arguments[0].click();", element)

事象2

スクリーンショットのログを確認すると、リンクが張られたテストページを撮っている。
※新しいタブで起動したはずのGoogleを撮りたい

この事象に関しては公式ドキュメントに記載があった。

新しいウィンドウで開くリンクをクリックすると、新しいウィンドウまたはタブが画面にフォーカスされますが、WebDriverはオペレーティングシステムがアクティブと見なすウィンドウを認識しません。 新しいウィンドウで作業するには、それに切り替える必要があります。

https://www.selenium.dev/ja/documentation/webdriver/interactions/windows/

ドキュメントを参考に下記のように修正を加えた。

def customer_actions_1():
        element = browser.find_element(By.XPATH, "//*[@id='GoogleBtn']/a")
        browser.execute_script("arguments[0].click();", element)
        handle_array = browser.window_handles
        browser.switch_to.window(handle_array[-1])

遷移後のスクリーンショットも想定通りとなっている。

参考にした記事

https://dev.classmethod.jp/articles/cloudwatch-synthetics-gui-workflow-builder/
https://qiita.com/Sho1981/items/fc07d83b33d11a54bfcd
https://stackoverflow.com/questions/73848842/error-message-element-not-interactable-is-displayed-when-i-try-upload-a-file
https://www.selenium.dev/ja/documentation/webdriver/interactions/windows/

Discussion