我刚开始使用角度为2的量角器进行e2e测试。我在登录后找到一个元素并在其上执行操作时遇到问题(点击)。
登录后,它使用父消息组件中的消息组件构建页面。当运行测试时,查找父组件它成功,运行第二个测试查找子组件并执行它成功的操作。但是当删除第一个测试时,它失败了。我正在测试组件级别,我只想测试必要的。这里不需要进行第一次测试。见代码:
declare var by: any;
declare var browser: any;
declare var element: any;
function login() {
let usernameInput = element(by.css("input[name=\"username\"]"));
let passwordInput = element(by.css("input[name=\"password\"]"));
let submit = element(by.css("button[type=\"submit\"]"));
usernameInput.sendKeys("Username");
passwordInput.sendKeys("welcome");
submit.click();
}
describe("my-App", function () {
let page: WebPage;
beforeEach(() => {
page = new WebPage();
});
// If I remove this it doesnt work
it("If we provide credentials to the login form we should be authenticated and login", () => {
page.navigateTo();
login();
expect(element(by.css("parent-element")).isPresent()).toBe(true);
});
it("should open conversation-component when clicking on a message", () => {
page.navigateTo();
// Do login here when the first it() is removed.
// login();
element(by.css("parent-element")).isPresent().then(function () {
let message = element.all(by.css(".child-message")).first()
message.click();
});
/*
== not working either ==
browser.wait(element(by.css("parent-component")).isPresent(), 5000).then(function () {
element.all(by.css(".child-message")).first().click();
});
*/
})
expect(element(by.css("conversation-component")).isPresent()).toBe(true);
});
不要真正了解控制流程。检索邮件需要几秒钟。我在配置中玩了超时,但没有。
答案 0 :(得分:1)
您应该使用beforeAll
语句登录,这将在describe块中的所有代码之前运行一次。
beforeAll(() => {
page.navigateTo();
login();
});
此外,您可以移动您的页面=新的WebPage();在beforeEach(()=> {})块之外。
describe("my-App", function () {
let page: WebPage;
page = new WebPage();
beforeAll(() => {
page.navigateTo();
login();
});
您的测试是在页面完全加载之前尝试与元素进行交互。在一个非纯粹的Angular.js的应用程序中发生这种情况是很常见的。
试试这段代码(我不是100%肯定它会起作用,因为看起来你正在使用打字稿)。
it('should open conversation-component when clicking on a message',() => {
page.navigateTo();
//browser.sleep(10000); //Uncomment this if the below solution does not work.
var EC = protractor.ExpectedConditions;
let message = $$('.child-message').first();
var isClickable = EC.elementToBeClickable(message);
browser.wait(isClickable,10000);
message.click();
});
isPresent()函数可以(以非常有创意的方式)等待元素,但是ExpectedConditions更适合这个。请参阅此链接以了解有关它们的更多信息。 http://www.protractortest.org/#/api?view=ProtractorExpectedConditions