首页 > 解决方案 > 当浏览器由 Selenium 启动时,即使手动也无法单击链接,但是当浏览器手动启动时它可以工作

问题描述

我有一个简单的链接。我可以导航到 Selenium 中的链接并获取其文本,但是当我尝试单击时,它什么也不做。我没有从 Selenium 收到任何错误,但我确实在控制台中收到错误:

main-es2015.92d20db….js:1 ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'length' of null
TypeError: Cannot read property 'length' of null
    at lv.applyUpdate (main-es2015.92d20db….js:1)
    at main-es2015.92d20db….js:1
    at Array.forEach (<anonymous>)
    at lv.init (main-es2015.92d20db….js:1)
    at lv.forEach (main-es2015.92d20db….js:1)
    at t._subscribe (main-es2015.92d20db….js:1)
    at t._trySubscribe (main-es2015.92d20db….js:1)
    at t.subscribe (main-es2015.92d20db….js:1)
    at U (main-es2015.92d20db….js:1)
    at H._innerSub (main-es2015.92d20db….js:1)
    at b (polyfills-es2015.1ca…2e128600892efa.js:1)
    at b (polyfills-es2015.1ca…2e128600892efa.js:1)
    at polyfills-es2015.1ca…2e128600892efa.js:1
    at l.invokeTask (polyfills-es2015.1ca…2e128600892efa.js:1)
    at Object.onInvokeTask (main-es2015.92d20db….js:1)
    at l.invokeTask (polyfills-es2015.1ca…2e128600892efa.js:1)
    at i.runTask (polyfills-es2015.1ca…2e128600892efa.js:1)
    at m (polyfills-es2015.1ca…2e128600892efa.js:1)
    at u.invokeTask [as invoke] (polyfills-es2015.1ca…2e128600892efa.js:1)
    at h (polyfills-es2015.1ca…2e128600892efa.js:1)
ns  @   main-es2015.92d20db….js:1
handleError @   main-es2015.92d20db….js:1

奇怪的是,在这种情况下,我什至无法手动单击它。也就是说,测试导航到页面然后点击 bpt,我尝试手动单击链接并获得相同的非操作和错误。

该页面是用 Angular 构建的(我对此几乎一无所知)并使用内部库(为了保持一致的外观)。

这是我尝试单击的链接的相关 HTML:

<a _ngcontent-sop-c73="" class="text-cta col-md-5" href="#/overview/00BB042420">View Contract</a>

它在稍微不同的链接上工作得很好:

<a _ngcontent-sop-c74="" class="text-cta col-md-4" href="#/detail/00AE036060"><span _ngcontent-sop-c74="" class="mat-body-strong">00AE036060</span></a>

当然,当我手动完成所有这些操作时,它会起作用。所以我在想,Selenium 启动浏览器的方式可能存在问题,并且被这个相当简单的链接暴露出来。以下是我在从测试开始之前在浏览器中设置的选项/首选项:

                Map<String, Object> preferences = new Hashtable<>();
                preferences.put("profile.default_content_settings.popups", 0);
                preferences.put("profile.default_content_setting_values.automatic_downloads", "true");
                preferences.put("download.prompt_for_download", "false");
                preferences.put("safebrowsing.enabled", "false");

                // disable flash and the PDF viewer
                preferences.put("plugins.plugins_disabled", new String[]{"Adobe Flash Player", "Chrome PDF Viewer"});

                // prevent pw save popup:
                preferences.put("credentials_enable_service", false);
                preferences.put("profile.password_manager_enabled", false);

                ChromeOptions cOptions = new ChromeOptions();
                cOptions.setExperimentalOption("prefs", preferences);
                LOGGER.debug("Preferences:\n" + cOptions.getExperimentalOption("prefs"));

                cap = DesiredCapabilities.chrome();
                cOptions.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
                cOptions.setCapability(ChromeOptions.CAPABILITY, cOptions);

                cOptions.addArguments("test-type");
                cOptions.addArguments("start-maximized");
                cOptions.addArguments("--js-flags=--expose-gc");
                cOptions.addArguments("--enable-precise-memory-info");
                cOptions.addArguments("--disable-popup-blocking");
                cOptions.addArguments("--disable-default-apps");
                cOptions.addArguments("chrome.switches", "--disable-extensions");
                cOptions.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
                cOptions.addArguments("--safebrowsing-disable-extension-blacklist");
                cOptions.addArguments("--safebrowsing-disable-download-protection");

这在 Edge(版本 91.0.864.71)和 Chrome(版本 92.0.4515.131)上失败。其他浏览器还没试过。

有点用完了想法,所以如果你有任何想法,我很乐意听到它们。

标签: htmlangularselenium-webdriver

解决方案


推荐阅读