Olo*_*lov 3 webdriver protractor
我有这个网站:http://embed.plnkr.co/Bs5iDqtXSSnvye2ORI6k/preview
码:
var app = angular.module('plunker', []);
var a = new Array(1000);
for (var i = 0; i< 1000; i++) {
a[i] = 'Name' + i;
}
app.controller('MainCtrl', function($scope, $interval) {
$scope.names = a;
$scope.start = function () {
$interval(function () {
$scope.names.pop();
}, 50);
}
});
Run Code Online (Sandbox Code Playgroud)
以下规格:
'use strict';
describe('Name list', function () {
it('should get the text of the last name', function () {
browser.driver.get('http://embed.plnkr.co/Bs5iDqtXSSnvye2ORI6k/preview');
browser.switchTo().frame(browser.driver.findElement(protractor.By.tagName('iframe')));
element(by.buttonText('start')).click();
expect(element.all(by.tagName('span)).last().getText()).toBe('Name999');
});
});
Run Code Online (Sandbox Code Playgroud)
而这个配置:
'use strict';
// An example configuration file.
exports.config = {
baseUrl: 'http://localhost:3000',
seleniumAddress: 'http://localhost:4444/wd/hub',
specs: ['stale.spec.js']
};
Run Code Online (Sandbox Code Playgroud)
当我运行Protractor时,我收到以下错误:
StaleElementReferenceError:陈旧元素引用:元素未附加到页面文档(会话信息:chrome = 43.0.2357.81)
(驱动程序信息:chromedriver = 2.15.322455(ae8db840dac8d0c453355d3d922c91adfb61df8f),platform = Mac OS X 10.10.3 x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:9毫秒有关此错误的文档,请访问: http://seleniumhq.org/exceptions/stale_element_reference.html构建信息:版本:'2.45.0',修订版:'5017cb8',时间:'2015-02-26 23:59:50'系统信息:主机:'ITs-MacBook-Pro.local',ip:'129.192.20.150',os.name:'Mac OS X ',os.arch:'x86_64',os.version:'10 .10.3',java.version:'1.8.0_31'驱动程序信息:org.openqa.selenium.chrome.ChromeDriver Capabilities [{applicationCacheEnabled = false,rotate = false,mobileEmulationEnabled = false,chrome = {userDataDir =/var/folders/rr/63848xd90yscgwpkfn8srbyh0000gq/T/.org.chromium.Chromium.rarNyX},takeHeapSnapshot = true,databaseEnabled = false,hand lesAlerts = true,version = 43.0.2357.81,platform = MAC,browserConnectionEnabled = false,nativeEvents = true,acceptSslCerts = true,locationContextEnabled = true,webStorageEnabled = true,browserName = chrome,takesScreenshot = true,javascriptEnabled = true,cssSelectorsEnabled = true} ]会议ID:235ec977a69d98c7f5b75a329e8111b2
这意味着我尝试与之交互的元素(获取元素的文本)不再附加到DOM.这个例子真的是我的规范.在我的真实规范中真正发生的是我尝试获取元素列表的最后一个元素的文本(由ng-repeat生成).还会发生的是,模型通过删除表示元素列表的数组的最后一个元素来更新.上面的例子只是重现错误(每次).
如果我注释掉这一行:element(by.buttonText('start')).click();规范是成功的.
我为此苦苦挣扎,并试图弄清楚为什么会这样.我首先想到的是,指向列表最后一个元素的元素查找器是在交互完成之前很久就已经创建的,所以我毫不奇怪,元素可以在创建之间的那段时间内与DOM分离.元素查找器和交互.
我后来发现的是,每次与某些事物进行交互时,都会在交互完成之前找到该元素.因此,指向最后一个元素应该实际指向与元素交互的时间的最后一个元素.
使用browser.pause()我能够看到WebDriver真正做了什么,这是两个任务之间的错误抛出:
(pending) Task::414<WebDriver.findElements(By.tagName("span"))>
| | | | | | Task: WebDriver.findElements(By.tagName("span"))
| | | | | | at Array.forEach (native)
Run Code Online (Sandbox Code Playgroud)
在这两者之间,DOM根据模型更新,并且列表的最后一个元素被分离.
(pending) Task::1170<WebElement.getText()>
| | | | | | Task: WebElement.getText()
| | | | | | at Array.forEach (native)
Run Code Online (Sandbox Code Playgroud)
DOM在这个小的执行漏洞中更新.目前,模型每50毫秒更新一次,这肯定会引发过时元素参考错误.但是如果我将间隔增加到1000毫秒,那么获得错误的机会就会少得多.因此,如果出现此错误,则取决于计算机的运行速度.
修复取决于你,但是我希望通过这些信息可以更清楚地做什么.
| 归档时间: |
|
| 查看次数: |
4187 次 |
| 最近记录: |