🐕
[AWS]CloudWatch Syntheticsでtarget=”_blank”属性のGUI外形監視をする
概要
- 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はオペレーティングシステムがアクティブと見なすウィンドウを認識しません。 新しいウィンドウで作業するには、それに切り替える必要があります。
ドキュメントを参考に下記のように修正を加えた。
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])
遷移後のスクリーンショットも想定通りとなっている。
参考にした記事
Discussion