我有一个DOM元素,应用了以下一些/所有效果:
#elem {
-webkit-transition: height 0.4s ease;
-moz-transition: height 0.4s ease;
-o-transition: height 0.4s ease;
transition: height 0.4s ease;
}
Run Code Online (Sandbox Code Playgroud)
我正在编写一个调整此元素大小的jQuery插件,我需要暂时禁用这些效果,以便我可以顺利调整大小.
暂时禁用这些效果(然后重新启用它们)的最优雅方法是什么,因为它们可能是从父母那里应用的,或者可能根本不适用.
我和Protractor有很多不稳定因素,我确信有些东西我不明白.有时我需要在继续之前单击按钮时使用.then(),有时它没有任何影响,我不应该使用.then()或测试失败.
我想知道在Protractor中测试时我应该何时使用.then()回调?示例:
createAccountForm = $('#form-create-account');
submitButton = createAccountForm.$('button[type=submit]');
browser.wait(EC.elementToBeClickable(submitButton), 5000);
submitButton.click(); // .then(function(){ <-- uncomment in the .then form
// find the confirmation message
var message = $('.alert-success');
browser.wait(EC.visibilityOf(message), 5000);
log.debug('After visibilityOf');
expect(message.isPresent()).to.be.eventually.true;
// }); --> uncomment when in .then form
Run Code Online (Sandbox Code Playgroud)
当我使用这种形式的测试(没有.then())时,我在浏览器上看到点击按钮没有完成,测试继续以下期望然后停止.
如果我使用.then()表单,则单击按钮即可完成,测试将继续,不会出现错误.
在其他测试中,单击按钮时我不需要使用then()回调.
那么,我什么时候应该使用.then(),什么时候不使用?
让 - 马克
我一直在经历间歇性超时,这是在Protractor常见问题解答中指责使用$ timeout进行轮询(AKA:waitForAngular超时).我不知道在没有投票的情况下它是否也会失败.对于我的团队来说,因为我们依赖于Angular Material组件,所以它更加轻松.他们在动画交互方面很重要,并且经常使用$ timeout(func,0).这个问题类似于问题#29966301,但侧重于Angular Material和Protractor之间可能存在的问题.我真的很想知道那些大量使用Angular Material和Protractor的人如果遇到这些问题就会处理这些问题.
有趣的是,我没有在Protractor和Angular Material github网站上看到过对彼此功能的任何利用.由于它们都是来自Google同一组的Angular库,@ juliemr和Protractor Gang可以与@ThomasBurleson和Material团队讨论,使用Protractor为Angular Material提供全面的用例和E2E测试以清除这些问题.
在Python中编写selenium测试时,我习惯于使用显式等待来等待页面加载,或等待元素变得可见或可点击等:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
Run Code Online (Sandbox Code Playgroud)
这里的关键概念是提供等待的预期条件,有多种类型:
与使用sleep硬编码时间间隔的s 相比,使用预期条件使代码更清晰,更可靠.
现在,我们正在将我们的端到端测试基础设施转换protractor为很多.
Expected Conditions量角器中是否有相似的python-selenium或
java-selenium?如果没有,明确等待条件的规范方法是什么protractor?
我查看了量角器文档并没有发现任何相关信息.
代码1:
element(by.id('myButtonId')).click();
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
Run Code Online (Sandbox Code Playgroud)
上面的代码工作很多次,然后它开始给出以下错误
"失败:陈旧元素引用:元素未附加到页面文档"
这个id"myValidationSummaryId"之前没有使用过,单击"myValidationSummaryId"中服务端提供的按钮发布表单和成功/失败消息.
代码2:
return element(by.id('myButtonId')).click().then(function () {
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
});
Run Code Online (Sandbox Code Playgroud)
修复代码如上所述固定原始问题并且它一直很好地工作很多次但后来它开始随机失败原始陈旧元素引用错误.
代码3:
return element(by.id('myButtonId')).click().then(function () {
return element(by.id('myValidationSummaryId')).waitReady().then(function (isReady) {
if (isReady) {
return element(by.id('myValidationSummaryId')).getText().then(function (val) {
return val;
});
} else {
return 'Failed to check success/failure message';
}
});
});
Run Code Online (Sandbox Code Playgroud)
然后我修复了上面的代码,现在它工作正常,waitReady函数主动等待一个元素存在并显示到指定的时间.
不应该是量角器/ WebdriverJS原本应该处理这个问题.
1>你能否解释为什么Code 1和Code 2有时会工作并且有时会失败?
2>您认为Code 3现在还好吗,并且每次都有效吗?
元素'myValidationSummaryId'只使用一次,然后点击,如果页面没有完全加载,如果元素尚未可用,它应该说没有找到元素,但为什么陈旧的元素引用?我使用pageLoadTimeout作为5分钟,页面加载几秒钟.这是非AngularJS应用程序和browser.ignoreSynchronization = true.
它到处谈论什么代码可以修复它,但没有发现为什么这种行为以及为什么WebdriverJS本身无法处理它.
我不时使用量角器 1.7 中引入的“预期条件”功能。
用例:
var EC = protractor.ExpectedConditions;
browser.wait(EC.visibilityOf(header.displayName), 10000);
Run Code Online (Sandbox Code Playgroud)
哪里header是页面对象。
如果header.displayName在 10 秒内不可见,则会抛出错误:
[firefox #4] 2) Describe description here
[firefox #4] Message:
[firefox #4] Error: Wait timed out after 10082ms
[firefox #4] Stacktrace:
[firefox #4] Error: Wait timed out after 10082ms
[firefox #4] ==== async task ====
[firefox #4] at [object Object].<anonymous> (/Path/to/project/test/e2e/my.spec.js:38:17)
Run Code Online (Sandbox Code Playgroud)
这不是很可读,需要一些时间来理解和研究。
题:
是否可以自定义这种等待超时错误?
仅供参考,我们可以提供自定义expect失败消息,如下所述:
protractor ×5
jasmine ×2
selenium ×2
testing ×2
angularjs ×1
css ×1
end-to-end ×1
javascript ×1
jquery ×1
promise ×1
python ×1