使用非角度页面切换窗口并将焦点放在WebDriver中

时间:2016-03-28 21:49:37

标签: selenium-webdriver protractor

我有两个非角度页面,一个有我能够输入文本的表单,一旦我点击Invoke按钮,我得到另一个浏览器窗口(在Chrome中显示为一个选项卡),带有一些文本输出。新选项卡成为焦点,但是一旦我尝试获取新元素,它就会重新聚焦在第一个选项卡上。这是我的测试结果:

beforeEach(function () {
        browser.ignoreSynchronization = true;
    });

    it('Do authentication of session', function () {
        session.goToCommandPage().then(function () {
            browser.findElement(by.css('#content > span:nth-child(3) > ul > li:nth-child(5) > a', 'AuthenticateUser')).click();
        }).then(function () {
            browser.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(3) > td:nth-child(2) > input')).sendKeys(COMPANY_ID);
        }).then(function () {
            browser.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(4) > td:nth-child(2) > input')).sendKeys('ADMIN');
        }).then(function () {
            browser.findElement(by.buttonText('Invoke')).click();
        }).then(function () {
            browser.sleep(7000);
        })
    });

    it('Switch to the results tab', function () {
        browser.getAllWindowHandles().then(function (handles) {
            browser.getTitle().then(function (title) {
                console.log('Title: ' + title);
            });
            if (handles.length === 2) {
                browser.switchTo().window(handles[1]).then(function () {
                    browser.sleep(7000);
                }).then(function () {
                    browser.getTitle().then(function (title) {
                        console.log('Title now: ' + title);
                    });
                    browser.findElement(by.css('.collapsible .expanded .text')).getText().then(function (textProduced) {
                        console.log('Text printed: ' + textProduced);
                    });
                });
            }
        });
    });

正如您在上面所看到的,我尝试使用句柄,但是在我访问句柄[1]的地方,它并没有在视觉上将标签更改为第二个。这段代码挂在我拿到句柄的地方。我看到标题打印出来,它是第一个表单的标题,但它只是在给出一个ScriptTimeoutError后超时。我甚至试图将钥匙发送到身体,这确实改变了标签,但第二个标签的元素无法找到。我正在使用Chrome和Protractor来运行我的测试。我通常使用角度页面,但这两个不是角度页面,而是做我将稍后在角度页面中检查的事情。

提前谢谢你。

编辑:我已经编辑了我的代码来浏览句柄并根据页面标题进行更改。它似乎没有改变到另一个标签。关于我可能做错什么的任何建议?注意:这是用JavaScript编写的。

it('Switch to the results tab', function () {
        browser.getAllWindowHandles().then(function (handles) {
            browser.getTitle().then(function (title) {
                console.log('Title: ' + title);
            });
            if (handles.length > 1) {
                handles.forEach(function (tab) {
                    browser.switchTo().window(tab).then(function () {
                        browser.sleep(7000);
                    }).then(function () {
                        browser.getTitle().then(function (title) {
                            console.log('Title now: ' + title);
                            if(title != 'WebService Web Service') {
                                browser.findElement(by.css('.collapsible .expanded .text')).getText().then(function (textProduced) {
                                    console.log('Text printed: ' + textProduced);
                                });
                            }
                        });
                    });
                });
            }
        });
    });

1 个答案:

答案 0 :(得分:0)

编辑:代码我用来转移到新打开的窗口,但它会导致" ScriptTimeoutError:超时:超时接收来自渲染器"的消息。

it('Switch to the results tab', function () {
        browser.driver.getAllWindowHandles().then(function (handles) {
            browser.driver.getTitle().then(function (title) {
                console.log('Title: ' + title);
            });
            if (handles.length > 1) {
                browser.driver.switchTo().window(handles[1]).then(function () {
                    browser.manage().timeouts().pageLoadTimeout(7000);
                }).then(function () {
                    var outputElement = $('.collapsible .expanded .collapsible-content .text');
                    var isClickable = EC.elementToBeClickable(outputElement);
                    browser.wait(isClickable, 12000, 'Waiting for output element');
                }).then(function () {
                    browser.driver.getTitle().then(function (title) {
                        console.log('Title now: ' + title);
                        browser.driver.findElement(by.css('.collapsible .expanded .collapsible-content .text')).getText().then(function (textProduced) {
                            console.log('Text printed: ' + textProduced);
                        });
                    });
                });
            }
        });
    });

以下代码有时会运行,但大部分时间都会失败。

以下是修改后的代码:

describe('Test', function () {
    beforeEach(function () {
        browser.ignoreSynchronization = true;
    });

    it('Do authentication of session', function () {
        session.goToCommandPage().then(function () {
            browser.sleep(12000);
        }).then(function () {
            browser.driver.wait(function () {
                return browser.driver.findElement(by.css('#content > span:nth-child(3) > ul > li:nth-child(5) > a'))
                    .then(function (elem) {
                        elem.click();
                        return true;
                    });
            }, 12000, 'Waited for the AuthenticateUser link to load');
        }).then(function () {
            browser.driver.wait(function () {
                return browser.driver.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(3) > td:nth-child(2) > input'))
                    .then(function (elem) {
                        elem.sendKeys(COMPANY_ID);
                        return true;
                    });
            }, 12000, 'Waited for the Company ID field to load');
        }).then(function () {
            browser.driver.wait(function () {
                return browser.driver.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(4) > td:nth-child(2) > input'))
                    .then(function (elem) {
                        elem.sendKeys('ADMIN');
                        return true;
                    });
            }, 12000, 'Waited for the User field to load');
        }).then(function () {
            browser.driver.wait(function () {
                return browser.driver.findElement(by.css('#content > span > form > table > tbody > tr:nth-child(6) > td:nth-child(2) > input'))
                    .then(function (elem) {
                        elem.submit();
                        return true;
                    });
            }, 12000, 'Waited for the Invoke button to load');
        }).then(function () {
            browser.sleep(7000);
        }).then(function () {
            browser.driver.wait(function () {
                return browser.driver.getAllWindowHandles().then(function (handles) {

                    if (handles.length > 1) {
                        return true;
                    }
                });
            }, 12000, 'Waited for window count to be greater than 1');
        });
    });

    it('Switch to the results tab', function () {
        browser.driver.getAllWindowHandles().then(function (handles) {
            browser.driver.getTitle().then(function (title) {
                console.log('Title: ' + title);
            });
            if (handles.length > 1) {
                handles.forEach(function (tab) {
                    browser.driver.switchTo().window(tab).then(function () {
                        browser.sleep(7000);
                    }).then(function () {
                        browser.driver.getTitle().then(function (title) {
                            console.log('Title now: ' + title);
                            if(title == 'localhost/Service/WebService.asmx/AuthenticateUser') {
                                browser.driver.findElement(by.css('.collapsible .expanded .collapsible-content .text')).getText().then(function (textProduced) {
                                    console.log('Text printed: ' + textProduced);
                                });
                            }
                        });
                    });
                });
            }
        });
    });
});

我不知道为什么我不能始终如一地通过。