Protractor 量角器查找并单击元素
我有一个非常简单的设置。我需要能够找到一个链接,并点击它。但每当我找到它并单击它时,我就会得到它 StaleElementReferenceError:stale元素引用:元素未附加到页面文档 有人能解释一下我做错了什么吗?如果我通过css将其作为目标,那么效果很好。只有当我使用量角器扩展时,它才会失败。页面上没有任何变化,我尝试过使用“waitForAngular”和长时间超时。同样的结果Protractor 量角器查找并单击元素,protractor,Protractor,我有一个非常简单的设置。我需要能够找到一个链接,并点击它。但每当我找到它并单击它时,我就会得到它 StaleElementReferenceError:stale元素引用:元素未附加到页面文档 有人能解释一下我做错了什么吗?如果我通过css将其作为目标,那么效果很好。只有当我使用量角器扩展时,它才会失败。页面上没有任何变化,我尝试过使用“waitForAngular”和长时间超时。同样的结果 <li ng-click="getLocation(l)" class="" ng-repeat=
<li ng-click="getLocation(l)" class="" ng-repeat="l in location" >
<div class="location_name">{{ l.LocationID }} - {{l.LocationName}}</div>
</li>
另外一个好处是向我解释如何让调试器工作。我正在使用最新版本的量角器(0.20.1)
无法打开端口5858上的套接字,等待1000毫秒后重试
Ex Dump
StaleElementReferenceError: stale element reference: element is not attached to the page document
(Session info: chrome=33.0.1750.146)
(Driver info: chromedriver=2.9.248307,platform=Mac OS X 10.9.1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 5 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '2.40.0', revision: 'fbe29a9', time: '2014-02-19 20:54:28'
System info: host: '.home', ip: '192.168.1.2', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.1', java.version: '1.6.0_65'
Session ID: 935f7630f50d9b1b4c8da73261e54153
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=MAC, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/var/folders/qj/xvhg6hv5245cryry73wygbkw0000gn/T/.org.chromium.Chromium.b5z7Xe}, rotatable=false, locationContextEnabled=true, version=33.0.1750.146, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]
Stacktrace:
Error
at null.<anonymous> (/Users//work////selenium/spec/locationsSpec.js:21:3)
at Object.<anonymous> (/Users//work////selenium/spec/locationsSpec.js:7:1)
At async task:
StaleElementReferenceError: stale element reference: element is not attached to the page document
(Session info: chrome=33.0.1750.146)
(Driver info: chromedriver=2.9.248307,platform=Mac OS X 10.9.1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 5 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '2.40.0', revision: 'fbe29a9', time: '2014-02-19 20:54:28'
System info: host: '.home', ip: '192.168.1.2', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.1', java.version: '1.6.0_65'
Session ID: 935f7630f50d9b1b4c8da73261e54153
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{platform=MAC, acceptSslCerts=true, javascriptEnabled=true, browserName=chrome, chrome={userDataDir=/var/folders/qj/xvhg6hv5245cryry73wygbkw0000gn/T/.org.chromium.Chromium.b5z7Xe}, rotatable=false, locationContextEnabled=true, version=33.0.1750.146, takesHeapSnapshot=true, cssSelectorsEnabled=true, databaseEnabled=false, handlesAlerts=true, browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true, applicationCacheEnabled=false, takesScreenshot=true}]
==== async task ====
WebElement.getText()
at element.(anonymous function) [as getText] (/Users//work////selenium/node_modules/protractor/lib/protractor.js:599:32)
at /Users//work////selenium/helpers/locations.js:10:18
at /Users//work////selenium/node_modules/protractor/lib/protractor.js:367:11
at Array.forEach (native)
at /Users//work////selenium/node_modules/protractor/lib/protractor.js:366:13
==== async task ====
asynchronous test function
StaleElementReferenceError:stale元素引用:元素未附加到页面文档
(会话信息:chrome=33.0.1750.146)
(驱动程序信息:chromedriver=2.9.248307,平台=Mac OS X 10.9.1 x86_64)(警告:服务器未提供任何堆栈跟踪信息)
命令持续时间或超时:5毫秒
有关此错误的文档,请访问:http://seleniumhq.org/exceptions/stale_element_reference.html
构建信息:版本:“2.40.0”,修订版:“fbe29a9”,时间:“2014-02-19 20:54:28”
系统信息:主机:'.home',ip:'192.168.1.2',os.name:'Mac os X',os.arch:'x86_64',os.version:'10.9.1',java.version:'1.6.0_65'
会话ID:935f7630f50d9b1b4c8da73261e54153
驱动程序信息:org.openqa.selenium.chrome.ChromeDriver
能力[{platform=MAC,acceptSslCerts=true,javascriptEnabled=true,browserName=chrome,chrome={userDataDir=/var/folders/qj/xvhg6hv5245cryry73wygbkw0000gn/T/.org.chromium.chromium.b5z7Xe},rotatable=false,locationContextEnabled=true,version=33.0.1750.146,takesHeapSnapshot=true,cssselector=true,databaseEnabled=false,handlesAlerts=true,browserConnectionEnabled=false,nativeEvents=true,webStorageEnabled=true,applicationCacheEnabled=false,takesScreenshot=true}]
堆栈跟踪:
错误
在空。(/Users//work///selenium/spec/locationsSpec.js:21:3)
反对。(/Users//work///selenium/spec/locationsSpec.js:7:1)
异步任务时:
StaleElementReferenceError:stale元素引用:元素未附加到页面文档
(会话信息:chrome=33.0.1750.146)
(驱动程序信息:chromedriver=2.9.248307,平台=Mac OS X 10.9.1 x86_64)(警告:服务器未提供任何堆栈跟踪信息)
命令持续时间或超时:5毫秒
有关此错误的文档,请访问:http://seleniumhq.org/exceptions/stale_element_reference.html
构建信息:版本:“2.40.0”,修订版:“fbe29a9”,时间:“2014-02-19 20:54:28”
系统信息:主机:'.home',ip:'192.168.1.2',os.name:'Mac os X',os.arch:'x86_64',os.version:'10.9.1',java.version:'1.6.0_65'
会话ID:935f7630f50d9b1b4c8da73261e54153
驱动程序信息:org.openqa.selenium.chrome.ChromeDriver
能力[{platform=MAC,acceptSslCerts=true,javascriptEnabled=true,browserName=chrome,chrome={userDataDir=/var/folders/qj/xvhg6hv5245cryry73wygbkw0000gn/T/.org.chromium.chromium.b5z7Xe},rotatable=false,locationContextEnabled=true,version=33.0.1750.146,takesHeapSnapshot=true,cssselector=true,databaseEnabled=false,handlesAlerts=true,browserConnectionEnabled=false,nativeEvents=true,webStorageEnabled=true,applicationCacheEnabled=false,takesScreenshot=true}]
==异步任务====
WebElement.getText()
at元素。(匿名函数)[as getText](/Users//work///selenium/node_modules/dragrator/lib/dragrator.js:599:32)
在/Users//work///selenium/helpers/locations.js:10:18
位于/Users//work///selenium/node_modules/dragrator/lib/dragrator.js:367:11
at Array.forEach(本机)
在/Users//work///selenium/node_modules/dragrator/lib/dragrator.js:366:13
==异步任务====
异步测试函数
我认为根本的问题是在调用getText
时我正在导航。下面的代码块完成了我所需要的
LocationsPage.prototype.goTo = function(name) {
var locations = element.all(by.repeater('l in location'));
expect(locations.count()).toNotBe(0);
return locations.map(
function(locationElement, index) {
return {
index: index,
text: locationElement.getText()
};
}
).then(function(items) {
_.each(items, function(item) {
if (item.text == name) {
console.log("clicking ", name)
locations.get(item.index).click();
};
});
});
}
*将下面的内容留在这里,以防有人想要一个如何执行更复杂/自定义承诺流的示例* 我找到了一个解决办法,但它的方法很复杂。希望有人能帮我简化这件事
我认为根本的问题是在调用
getText
时我正在导航
LocationsPage.prototype.goTo = function(name){
var locations = element.all(by.repeater('l in location'));
expect(locations.count()).toNotBe(0);
return protractor.promise.createFlow(function(flow){
var found;
var locations = element.all(by.repeater('l in location'));
var searchPromise = protractor.promise.defer();
flow.execute(function(){
var idx = 0, found = -1;
locations.each(function(item){
var _idx = idx;
if(found >= 0){
console.log("skipping")
return;
}
item.getText().then(function(text){
if(text == name){
console.log("setting found.")
found = _idx;
}
if(found >= 0 || _idx === locations.count()-1){
searchPromise.fulfill(found);
}
});
idx++;
});
return searchPromise.promise;
})
flow.execute(function(){
var promise = protractor.promise.defer();
searchPromise.then(function(idx){
locations.get(idx).click().then(function(){
promise.fulfill(true);
});
})
return promise.promise;
});
});
}
你会注意到那里有一些其他的东西
量角器.promise.createFlow
我不得不使用它,因为我的期望当我只使用量角器.promise.defer()
时没有正确地解决问题。每当发生更新时,对象将替换自身。实际上,我建议将它们的ng repeat更新为ng repeat=“l in location track by$index”
,以便正确替换它们。这可能无法解决问题
不要使用。每个都做一个。过滤器
var locations = element.all(by.binding('{{l.LocationName}}'))
.filter(function(elem, index) {
return elem.getText().then(function(text) {return text === name;});
}).click();
var locations = element.all(by.binding('{{l.LocationName}}'))
.filter(function(elem, index) {
return elem.getText().then(function(text) {return text === name;});
}).click();