gpt4 book ai didi

javascript - Protractor - StaleElementReferenceException 偶尔发生

转载 作者:行者123 更新时间:2023-11-29 21:40:45 27 4
gpt4 key购买 nike

我一直在使用 protractor/jasmine2 解决陈旧元素引用异常的问题。

我的规范:

var LoginPage = require('../pages/login_page.js');
var WelcomePage = require('../pages/welcome_page.js');

describe('Test -> testing something', function () {

var loginPage;
var EC = protractor.ExpectedConditions;
var waitTimeout = 10000;

function logIn() {
loginPage.setUser('user');
loginPage.setPassword('password');
loginPage.login();
}

beforeEach(function () {
browser.ignoreSynchronization = true;
loginPage = new LoginPage();
browser.wait(EC.presenceOf(loginPage.userLogin), waitTimeout);
logIn();
var welcomePage = new WelcomePage();
browser.wait(EC.visibilityOf(welcomePage.usersButton), waitTimeout);
welcomePage.usersButton.click();
});

问题是当我想单击 usersButton 时,StaleElementReferenceException 随机出现在 beforeEach 函数的最后一行。不知道为什么 ExpectedCondition 不起作用(也尝试过不同的 EC,如 presenceOf、elementToBeClickable 等,但没有解决问题)。

参见定义了 usersButton 的页面以供引用:

'use strict';
var WelcomePage = function () {
};

WelcomePage.prototype = Object.create({}, {
usersButton: {
get: function () {
return element(by.css('#users a'));
}
}
});

module.exports = WelcomePage;

我认为需要一些通用的 retry_mechanism 来处理它,有人有类似的问题吗?


终于写出了这样的功能

var clickOn = function (element) {
browser.wait(EC.visibilityOf(element), waitTimeout).then(function() {
element.click();
});}

调用方式如下:

    clickOn(welcomePage.usersButton);

更新:已经对其进行了多次测试,当我在 selenium 网格上运行测试时,我仍然在这个确切的元素上遇到 Stale Element 异常。所以提供的解决方案不起作用......

Failed: stale element reference: element is not attached to the page document (Session info: chrome=45.0.2454.93) (Driver info: chromedriver=2.19.346078 (6f1f0cde889532d48ce8242342d0b84f94b114a1),platform=Windows NT 6.1 SP1 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 15 milliseconds For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html Build info: version: '2.47.1', revision: '411b314', time: '2015-07-30 03:03:16' System info: host: 'ITHFPC17', ip: '10.98.0.48', os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.8.0_40' Driver info: org.openqa.selenium.chrome.ChromeDriver Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, chrome={userDataDir=C:\Users\SELENI~1\AppData\Local\Temp\scoped_dir2384_11396}, takesHeapSnapshot=true, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=45.0.2454.93, platform=XP, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true}] Session ID: 3244710644015ee170986333564ab806
Failed: Wait timed out after 10032ms

下一个方法是等到元素出现,然后如果它可见,然后如果它可点击......但它不起作用。奇怪的是,在 selenium 网格上一切正常,但是当我尝试在本地运行测试时出现前面提到的异常。

exports.clickOn = function (element) {
browser.wait(EC.presenceOf(element), waitTimeout).then(function () {
browser.wait(EC.visibilityOf(element), waitTimeout)
}).then(function () {
browser.wait(EC.elementToBeClickable(element), waitTimeout)
}).then(function () {
element.click();
});
};

有人知道如何处理吗? ...我卡住了。

最佳答案

通过解析 wait until elementToBeClickable() 函数返回的 promise ,等待元素有资格被点击。还要确保完成 click() 之前的操作,以便 Protractor 可以按预期找到元素。将所有操作相互链接可能是一个很好的解决方案。这样可以避免 StaleElementReferenceException 错误。方法如下 -

browser.wait(EC.presenceOf(loginPage.userLogin), waitTimeout).then(function(){
logIn();
}).then(function(){
var welcomePage = new WelcomePage();
}).then(function(){
browser.wait(EC.elementToBeClickable(welcomePage.usersButton), waitTimeout).then(function(){
welcomePage.usersButton.click();
});
});

希望对您有所帮助。

关于javascript - Protractor - StaleElementReferenceException 偶尔发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33036579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com