我正在使用量角器进行测试.99%的时间没有必要真正看到浏览器,测试需要很长时间,而我们感兴趣的是最终结果.有没有办法隐藏为测试打开的浏览器(例如在后台运行)?
例如,我有这个应用程序的HTML代码:
<div class="swipe-cover" ng-swipe-left="func()"></div>
Run Code Online (Sandbox Code Playgroud)
这样的测试:
it('test', function() {
browser.executeScript( 'angular.element(".swipe-cover").triggerHandler("swipeleft")' );
});
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
如果我使用'click'insteaf'swipeleft',它就可以了.
如何为e2e测试触发'swipeleft'事件?
如何编写需要与文件Input DOM元素交互的e2e流测试?
如果它是文本输入,我可以与它交互(检查值,设置值)等作为它的DOM组件.但是如果我有一个文件输入元素,我猜测交互是有限的,直到我可以打开对话框来选择文件.我无法前进并选择我要上传的文件,因为对话框是本机的而不是某些浏览器元素.
那么我如何测试用户是否可以从我的网站正确上传文件?我正在使用赛普拉斯编写我的e2e测试.
我想为我的应用程序编写功能测试,我想模拟我的loginService服务,以加快测试速度.我不想模拟$ http,而是内部调用它的服务,但是我不能把一个间谍放在函数loginService.validate上,它将HTTP查询发送到服务器,但它没有被加载,因为它在驱动程序中,而不是在测试本身.我也看了一下addMockModule但我无法理解如何使用它.有一种简单的方法可以做我想要的吗?我看了看这些,但他们没有帮助:
如何从angular2运行时检测到我在e2e测试模式下运行?我有一个会话刷新间隔,我不想在测试模式下设置,以避免与量角器同步问题.
一个明显的答案是寻找一个URL参数.有没有那么脏的解决方案?
EDIT(赏金前的澄清):量角器连接到角度(1或2),以便在评估任何东西之前等待所有未完成的工作完成.这意味着所有突出的角度promises或任何有效的角度timer都将悬挂量角器测试(最终导致它们失败).最常提出的解决方案是设置,browser.ignoreSynchronization = true但这将迫使我在回调链中嵌套所有e2e测试或使用一堆睡眠.可能两者都有.因此,我似乎陷入了摇滚和困难的地方之间,要么在编写e2e测试时遇到真正的艰难经历,要么在特定的应用程序代码行中设置条件,以便在"测试模式"(eww,丑陋)时不运行.我选择更简单的e2e测试,因为我希望将它们写成数百个,到目前为止我们只讨论一个在测试期间不重要的间隔(会话刷新的间隔为30分钟).
我正在尝试使用Protractor和Cucumber为我的Web应用程序创建一个包含E2E测试的存储库.我从这个存储库开始:https://github.com/spektrakel-blog/angular-protractor-cucumber
当我强迫Protractor将应用程序视为常规网页时,测试运行正常.测试运行器正在与应用程序交互并期待一些结果.问题是,我想让Protractor检测Angular,以便在检查'Then'断言之前等待区域稳定.
这是我的protractor.conf.js:
exports.config = {
allScriptsTimeout: 30000,
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: ['--no-sandbox']
}
},
directConnect: true,
baseUrl: 'http://<ci-server-address>/',
specs: [
'./e2e/features/*.feature'
],
framework: 'custom',
frameworkPath: require.resolve('protractor-cucumber-framework'),
cucumberOpts: {
require: ['./e2e/steps/**/*.ts'],
strict: true,
format: [
'json:reports/summary.json'
],
dryRun: false,
compiler: []
},
onPrepare() {
browser.ignoreSynchronization = true;
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
}
};
Run Code Online (Sandbox Code Playgroud)
简而言之 - 测试使用以下配置运行,但是当我删除时browser.ignoreSynchronization = true;,我收到以下错误:Timed out waiting for asynchronous Angular tasks to finish after 30 seconds. This may …
是否可以将赛普拉斯浏览器日志和命令日志重定向或捕获到输出?
我在这个主题上读了一些赛普拉斯的github 问题.但我不知道如何使它发挥作用.
基本上,我想在无头非GUI模式下捕获所有赛普拉斯GUI命令日志.如果我可以包含浏览器控制台日志会更好.目的是了解测试失败时发生的情况.
我使用teamcity作为ci.这是我的构建日志的示例.我想在这里看到所有命令日志.实际上,在服务器端运行的任何console.log cy.task都显示在构建日志中.跑步cy.task('log',message)太手动了.有更聪明的方法吗?
[09:49:08][Step 1/1] 2 of 4: new actions (52s)
[09:50:00][Step 1/1] 3 of 4: new actions (52s)
[09:50:53][Step 1/1] 4 of 4: new actions (53s)
[09:51:47][Step 1/1] (Results)
[09:51:47][Step 1/1]
[09:51:47][Step 1/1] ???????????????????????????????????????
[09:51:47][Step 1/1] ? Tests: 8 ?
[09:51:47][Step 1/1] ? Passing: 8 ?
[09:51:47][Step 1/1] ? Failing: 0 ?
[09:51:47][Step 1/1] ? Pending: 0 ?
[09:51:47][Step 1/1] ? Skipped: 0 ?
[09:51:47][Step 1/1] ? Screenshots: 0 ?
[09:51:47][Step 1/1] …Run Code Online (Sandbox Code Playgroud) 我正在为 Angular 7.x 应用程序运行 E2E 测试。测试在我的本地机器上直接运行。但是当我将它推送到 repo (GitLab) 时,管道失败并抛出以下错误:
用户配置文件 - 检查并更改配置文件 - 失败:元素不可交互(会话信息:chrome=71.0.3578.80)(驱动程序信息:chromedriver=2.45.615279(12b89733300bd268cff3b78fc76cb8f3a7cc44e5)-444e5-Linux4
测试用例:
it('USER PROFILE - Check and change PROFILE', () => {
page.navigateTo();
browser.sleep(1000);
expect(page.getProfileEditTagName()).toMatch('app-edit-profile');
expect(element(by.className('logged-as')).getText()).toBe( testEmail );
browser.actions().mouseMove( element.all( by.id('editIcon-salutation') ).get(0)).click().perform().then(function () {
browser.sleep(4000);
element( by.className('mat-select-arrow') ).click().then(function () {
browser.actions().mouseMove( element.all(by.className('option-value mat-option')).get(0)).click().perform();
browser.sleep(1000);
browser.actions().mouseMove( element.all( by.id('saveButton-salutation') ).get(0)).click().perform();
browser.sleep(1000);
});
});
});
Run Code Online (Sandbox Code Playgroud)
navigateTo()只是profile.po.ts 中的一个方法:
navigateTo() {
browser.get('/profileComponentUrl');
}
Run Code Online (Sandbox Code Playgroud)
令我困惑的是,我什至无法定位错误或错误的地方是它在本地运行良好。但是一旦我推送到 repo,它就会在那个测试用例中完全失败。请问有什么提示吗?
我想知道如何在<a>链接上的点击事件后捕获和读取 URL 。
在 onClick 事件中,我们的 javascripthref对所点击链接的实际内容进行一些字符串操作,然后动态window.location.href = myNewReplacebleURL完成。原始href位置不一定是您在 onClick 之后到达的位置。
这是我开始的方式:
describe("Twitter", function() {
it("Should assert that via value is set correctly in JS", function() {
cy.server();
cy.visit(Cypress.config("appUrl") + "/probes/sha/sha-via.html");
cy.get("#v_test ul.share li a")
.click();
});
});
Run Code Online (Sandbox Code Playgroud)
编辑:我想要的是捕获位于“页面加载”步骤的 URL。
我是赛普拉斯的新手。我的应用程序作为“路由系统”手动更改window.location.hash。在某些时候,我单击一个更改哈希值的按钮,因此应该在测试期间更改页面。我可以看到执行过程中出现一个“new url”条目,但是如何让 cypress 访问该 url?
简而言之,问题是什么:你可以看到我输入了密码,然后{enter}。运行测试我可以看到地址栏中的哈希值发生变化,但页面并没有根据哈希值变化而变化。
这是测试代码
context("Workflow", () => {
it("login", () => {
cy.visit("http://localhost:3000/src/#login")
cy.get("#username").type("demo").should("have.value", "demouser")
cy.get("#password").type("demo{enter}").should("have.value", "demo") // this should redirect to "/#home"
//cy.wait(10000)
cy.get(".subtitle").should("have.value", "Welcome") //this line fails as ".subtitle" is an element of "/#home"
})
})
Run Code Online (Sandbox Code Playgroud)
编辑:经过大量失败的尝试,我想出了一个部分有效、笨重且hacky的解决方案。我认为我不需要使用它reload()来解决这个问题(必须有更好的解决方案..),但为了使其正常工作,我必须等待所有远程请求完成(否则reload()取消它们)。我说部分工作是因为你可以从代码中的注释中看到,如果我尝试#login先访问,然后按照重定向#home,然后将页面更改为#browser,最后一个不起作用(我可以看到哈希更改为#browser,但是页面仍然是#home)。
import 'cypress-wait-until';
let i = 0;
context("Workflow", () => {
it("login", () => {
cy.server( {
onRequest: () …Run Code Online (Sandbox Code Playgroud) e2e-testing ×10
protractor ×6
cypress ×4
angular ×2
angularjs ×2
javascript ×2
testing ×2
angular-e2e ×1
cucumber ×1
lit-element ×1
swipe ×1