angularjs - 单击打开的非 Angular 页面 - 未使用ignoreSynchronization定义 Angular 或等待Angular而不使用

标签 angularjs selenium protractor e2e-testing webdriverjs

经过大量研究和修改,我似乎无法真正让我的 Protractor 测试执行除 Angular 相关错误之外的任何其他操作,即使我使用浏览器来避免检测到 Angular。

测试涉及一个 Angular 应用程序,打开其中的下拉菜单,然后单击控制台的链接;控制台在单独的窗口中打开一个非 Angular 管理页面。

因此,根据我发现的许多信息丰富的 SO 帖子,我首先使用了这个......

browser.driver.getAllWindowHandles().then(function(handles) {
    browser.driver.switchTo().window(handles[1]).then(function() {
//expect for new window here
            });
        });

这似乎有效,因为我可以很容易地通过 repl 到达窗口。 问题是当添加以下任一内容时......

browser.driver.getAllWindowHandles().then(function(handles) {
    browser.driver.switchTo().window(handles[1]).then(function() {
        expect(browser.getLocationAbsUrl()).toContain('/console/login.jsp');
        expect(browser.driver.findElement(By.css('th.login')).getText()).toEqual('Login');
            });
        });

一个期望检查 URL,另一个期望检查页面上的 header 元素,该元素是一个表头。当我运行它时,我得到以下信息:

Error while waiting for Protractor to sync with the page: "angular could not be found on the window"

当我决定在函数中或在 beforeEach 中使用 browser.ignoreSynchronization = true 时,无论是否带有以下 afterEach > 将其设置为 false,我得到以下结果:

JavascriptError: angular is not defined

我似乎无法得到任何“有用”的错误来帮助我调试它,并且在 repl 中尝试它也没有帮助,因为我遇到了同样的问题。 全面地说,尝试我的 URL Expect 而不获取第二个窗口将为我提供根,而另一个将失败。 只做其中之一就会导致同样的问题。 更改为常规语法 (element(by.css...)) 不会改变任何内容。

最佳答案

我的第一个问题就这么多......

看来我对 browser.getLocationAbsUrl() 的使用是用于 Angular 页面,并且导致了我的问题...... 本质上,即使我相信我使用的是纯 Webdriver 调用,该调用仍然需要页面上的 Angular 才能工作...... 如 another post 中所述,使用 browser.driver.getCurrentUrl() 是使用 Webdriver 的非 Angular 调用,并修复了该问题。因此,最终代码如下...

browser.sleep(1000); //to wait for the page to load
        browser.driver.getAllWindowHandles().then(function(handles) {
            browser.driver.switchTo().window(handles[1]).then(function() {
                expect(browser.driver.getCurrentUrl()).toContain('/console/login.jsp');
                expect(browser.driver.findElement(By.css('th.login')).getText()).toEqual('Login');
            });
        });

顺便说一句,这无需设置ignoreSynchronization即可工作。 我意识到修复它可能是相对简单的事情,只是没想到我会这么快得到它(我本来打算昨晚提交问题,但今天早上发布了)。

无论如何,我希望这至少能为面临同样问题的其他人提供一个很好的引用。

关于angularjs - 单击打开的非 Angular 页面 - 未使用ignoreSynchronization定义 Angular 或等待Angular而不使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159311/

相关文章:

javascript - Protractor 无法使用定位器 by.partialButtonText 或 by.buttontext 识别 angularjs 按钮

javascript - AngularJS:来自动态设置模型名称的嵌套对象

javascript - 如何使用 AngularJS 获取光标下的单词?

java - 需要帮助解决 webdriver 中的问题(无法在 PATH 中找到 firefox 二进制文件。请确保已安装 firefox。)

angularjs - 使用phantomjs浏览器运行 Protractor 时,只能运行一次测试

linux - 如何在.sh文件中编写ssh连接代码以连接到远程计算机

angularjs - FAB快速拨号和“简单”下拉菜单不起作用

javascript - 使用 Angular 显示 JSON 中的 HTML

C# Selenium 如何实现点击没有 id 的按钮

python - Selenium PhantomJS webdriver 无法获取 ajax 内容