【问题标题】:StaleElementReferenceException when I try to get window.dataLayer with Selenide当我尝试使用 Selenide 获取 window.dataLayer 时出现 StaleElementReferenceException
【发布时间】:2020-04-18 12:44:22
【问题描述】:

我想在我的页面上从 Google Analytics 获取 gtm dataLayer 事件,并在登录/注销后检查它们的内容。我在测试中使用 Selenide + java 页面上没有操作的代码示例

open("url");
List<Map<String, String>> result = new ArrayList<>();
List<Map<String, String>> dataLayerEventsList = Selenide.executeJavaScript("return window.dataLayer");
        for (Map<String, String> map:dataLayerEventsList) {
            if (map.containsKey("firstKey") && map.containsKey("secondKey"))
                result.add(map);
        }
        return result;

当我不在页面上执行某些操作时,我会收到事件(只需打开页面并返回 window.dataLayer),但是当我执行某些操作时,F.E. 单击元素,setValue 然后当我想要获取 GA 事件时同样的方式我在方法 Selenide.executeJavaScript("return window.dataLayer") 中有一个错误

org.openqa.selenium.StaleElementReferenceException: stale element reference: stale element not found

页面上的操作代码示例

open("url");
$(By.className("login-form__select")).click();
SelenideElement login = $x("//div/../input").setValue("5645645");
SelenideElement password = $x("//div/../input").setValue("6666");
$x("//button[contains(@class,'login-form_999')]").click();
List<Map<String, String>> result = new ArrayList<>();
List<Map<String, String>> dataLayerEventsList = Selenide.executeJavaScript("return window.dataLayer");
        for (Map<String, String> map:dataLayerEventsList) {
            if (map.containsKey("firstKey") && map.containsKey("secondKey"))
                result.add(map);
        }
        return result;

我该如何解决这个问题?请帮忙

【问题讨论】:

  • StaleElementReferenceException 当试图对其执行操作的元素在 DOM 中不可用时发生。使用 WebDriverWait 解决您的问题
  • 我尝试等待并睡眠大约 20 秒,但没有帮助
  • 提供您的链接或 DOM 吗?
  • 不幸的是,我不能。这是商业的
  • 嗨,window.dataLayer 是用于将数据和事件推送到 Google 跟踪代码管理器的 API。从 GTM 可以配置最终触发 Google Analytics 命中的触发器。您能否更明确地说明您要实现的目标和目的?这将有助于提供更好的答案

标签: java selenium google-analytics google-datalayer selenide


【解决方案1】:

请在找到您尝试点击的元素之前再次找到该元素。

Stale Exception 基本上意味着您的元素无法被定位,因为它不在 DOM 中知道,其背后的原因是 For Ex。您找到了一个元素并假设您刷新了页面或导航到其他页面,然后您尝试使用在执行操作之前找到的该元素,然后将引发 Stale Element 异常。

希望这会有所帮助。

【讨论】:

  • 点击或选择成功,使用方法executeJavaScript("return window.dataLayer")的问题,这里我没有选择任何元素,不明白为什么会出现这里的错误= (
【解决方案2】:

我找到了决定。首先,由于发生错误,我无法获取 window.dataLayer 事件的所有列表,但是,我可以获取 window.dataLayer.lenth,并查看我选择需要的每个事件,并使用 try..catch 和 continue 当然绕过我的错误

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    相关资源
    最近更新 更多