等待元素更改其值(文本)
Wait for element to change its value(text)
我在使用量角器的第三天,在等待页面加载和元素出现方面,我经常遇到金砖四面墙。特别是这个测试用例变得丑陋,我想解决这些问题而不必依赖睡眠。
我目前"在AngularJS的土地之外"
it('it should reflect in both the field and the title when the personnel name is changed', function() {
var inputField, personnelHeader, personnelName;
personnelName = element(By.css(".overlay.editnameoverlay")).click();
personnelHeader = element(By.id("personnel_name_header"));
inputField = element(By.css("input[name='newvalue']"));
inputField.clear();
inputField.sendKeys("Test 123");
element(By.css("input[name='ok_button']")).click();
// browser.driver.sleep(2000); This test only works with this sleep added
browser.wait(function() {
console.log("Waiting for header to change...");
return personnelHeader.getText().then(function(text) {
return text === "Test 123";
});
}, 5000);
return expect(personnelHeader.getText()).toBe(personnelName.getText());
});
因此,此处的测试会更改输入字段中的名称。 提交它并等待更改反映在模态的标头中。问题是没有browser.driver.sleep(2000)我得到一个错误说
Stacktrace:
StaleElementReferenceError: stale element reference: element is not attached to the page document
在这种特殊情况下,我该如何解决这个问题?
来自预期条件的文档:
var EC = protractor.ExpectedConditions;
// Waits for the element with id 'abc' to contain the text 'foo'.
browser.wait(EC.textToBePresentInElement($('#abc'), 'foo'), 5000);
当您使用量角器测试非角度页面时,您需要自己等待元素准备好进行交互。
StaleElementReferenceError
可能是最无用的硒错误,它发生在元素从 DOM 中删除但仍以某种方式缓存时,我在开始使用量角器时也遇到了这个问题,甚至试图说服它应该自动重试量角器端。
对我来说,解决方案是始终使用自定义函数显式等待元素出现在页面上,waitReady()
该函数browser.wait
准备好的元素,即:等待元素准备好进行交互:
expect($('#login_field').waitReady()).toBeTruthy();
首先将此代码片段集成到代码中:https://gist.github.com/elgalu/2939aad2b2e31418c1bb
自定义waitReady()
不仅会等待元素,而且还会吞下任何不相关的无用 Web 驱动程序错误,例如StaleElementReferenceError
,并且只会重试直到找到元素,否则它将超时。
因此,在交互之前,即在clear()
或sendKeys()
或click()
之前waitReady()
每个元素......
// TODO: Move to Page Objects module
var personnelNameElm = $(".overlay.editnameoverlay");
var personnelHeaderElm = $("#personnel_name_header");
var inputFieldElm = $("input[name='newvalue']");
var okBtnElm = $("input[name='ok_button']");
it('it should reflect in both the field and the title when the ' +
'personnel name is changed', function() {
expect(personnelNameElm.waitReady()).toBeTruthy();
personnelNameElm.click();
expect(inputFieldElm.waitReady()).toBeTruthy();
inputFieldElm.clear().sendKeys("Test 123");
expect(okBtnElm.waitReady()).toBeTruthy();
okBtnElm.click();
browser.wait(function() {
console.log("Waiting for header to change...");
// Using waitReady() before getText() avoids Stale element errors
return personnelHeaderElm.waitReady().then(function() {
return personnelHeaderElm.getText().then(function(text) {
return text === "Test 123";
});
});
}, 5000);
expect(personnelHeaderElm.getText()).toEqual(personnelNameElm.getText());
});
相关文章:
- 如何在浏览器中选择所有*renderable*文本元素
- 如何使用RaphaelJS将文本元素约束在正方形中
- 使用d3.js删除svg文本元素
- 替换动态生成的文本元素
- Protractor测试:如何设置登录表单中文本元素的值
- 如何获取与提交表单上所选复选框相同行的文本元素
- SVG文本锚点设置使文本元素移动
- Svg文本元素被另一个Svg元素重叠
- Imacros替换文本元素
- Windows 8 上的 Safari 5 反转 SVG 上的所有文本元素
- 运行 PHP 代码以根据文本元素的值从数据库中获取值
- 我想要输入文本元素中的实时更改事件
- 如何使用 jQuery 忽略文本元素上的特定字符
- RaphaelJS中的文本元素不会在触摸设备上拖动
- d3 - 旋转数组中的文本元素
- 如何通过单击复选框将文本元素从输入复制到另一个输入
- .text() 给出元素中的所有文本元素
- 在函数内调用对象文本元素
- 移动文本元素与弧拉斐尔JS
- 编辑文本元素时,将重置后端用户设置