量角器元素在点处不可点击
Protractor element not clickable at point
我正在尝试使用量角器登录 google 帐户
google-账号-spec.js
const loginPage = require('../pages/login-page');
const EC = ExpectedConditions;
describe('google accounts', function () {
it('should log in', async function () {
try {
browser.waitForAngularEnabled(false);
browser.ignoreSynchronization = true;
browser.get('https://accounts.google.com/signin/v2/identifier?flowName=GlifWebSignIn&flowEntry=ServiceLogin');
//writing my email into an email input
await loginPage.sendKeysEmailInput('email');
//clicking on the next button for the email input
loginPage.getEmailNextButton().click();
await browser.wait(EC.presenceOf(loginPage.getPasswordInput()), 300000);
let id = await loginPage.getPasswordInput().getAttribute('id');
await browser.wait(EC.elementToBeClickable(element(by.name(id))), 300000);
//writing my password into password input
await element(by.name(id)).sendKeys('password');
//waiting for the next button for the password input to become clickabe
await browser.wait(EC.elementToBeClickable(element(by.id('passwordNext'))), 5000);
await browser.wait(EC.presenceOf(element(by.id('passwordNext'))), 5000);
//trying to click on next button for the password input and getting an error
await element(by.id('passwordNext')).click();
} catch (expection) {
console.error(expection);
}
});
});
conf.js
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
onPrepare : function() {
// browser.manage().window().setSize(1600, 1000);
browser.manage().window().maximize();
},
capabilities: {
'browserName': 'chrome'
},
specs: ['specs/google-accounts-spec.js'],
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 3000000,
}
};
login-page.js 我正在使用 PageObject 模式(login-page 是一个页面对象)
var loginPage = function () {
var emailInput = element(by.id('identifierId'));
var passwordInput = element(by.id('password'));
var emailNextButton = element(by.id('identifierNext')).element(by.tagName('span'));
this.sendKeysEmailInput = async function(keys) {
await emailInput.clear().sendKeys(keys);
};
this.getPasswordInput = function () {
return passwordInput;
};
this.sendKeysPasswordInput = async function(keys) {
await passwordInput.clear().sendKeys(keys);
};
this.getEmailNextButton = function(){
return emailNextButton;
}
};
module.exports = new loginPage();
当我尝试点击下一步按钮输入密码时出现错误
{ WebDriverError: unknown error: Element ... is not clickable at point (1100, 527).
Other element would receive the click:
它说该元素不可点击,但之前在代码中我一直在等待它变为可点击。所以我就是不明白,这个元素怎么不能点击。
我也尝试在 conf.js 的 onPrepare 中最大化 window 但仍然出现相同的错误。
奇怪的是,我并不是一直都遇到这个错误,它发生在 3 次尝试中的 1 次。我想那是因为我的网速高。
我知道有一种简单的方法可以通过编写 browser.sleep() 来解决这个问题,但我认为有更好更快的解决方案,因为使用 browser.wait() 你可以等待比你实际应该做的要多得多,因此,我的程序会变得更慢。
这可能是由于您希望单击的元素被包裹。
例如,您希望单击 'input',但必须单击他的包装器 'div',并且在这种情况下可能会引发错误。
要绕过这个问题,可以点击wrapper或者执行JS点击。
export async function jsClickButton(button: ElementFinder) {
try {
return await browser.executeScript('arguments[0].click()', button).then(async() => {
console.log('Element has been clicked.');
});
} catch (error) {
console.log('Element could not be clicked', error);
}
}
首先 browser.waitForAngularEnabled 与 browser.ignoreSynchronization 相同,最后一个从量角器 5.1 及更高版本中删除。从您的代码中删除任何一个。
然后您将 promises 与异步函数混合在一起。因此应该是 await browser.waitForAngularEnabled(false); await browser.get()
而且你在 loginPage.getEmailNextButton
之前错过了 await
。这很可能导致了您的问题。
最后你的消息说 WebDriverError: unknown error: Element ... is not clickable at point (1100, 527). Other element would receive the click:
。看看哪个元素实际上获得了点击,如果它真的阻止你与你的元素交互,看看你是否需要关闭该元素或做任何其他事情。
我正在尝试使用量角器登录 google 帐户
google-账号-spec.js
const loginPage = require('../pages/login-page');
const EC = ExpectedConditions;
describe('google accounts', function () {
it('should log in', async function () {
try {
browser.waitForAngularEnabled(false);
browser.ignoreSynchronization = true;
browser.get('https://accounts.google.com/signin/v2/identifier?flowName=GlifWebSignIn&flowEntry=ServiceLogin');
//writing my email into an email input
await loginPage.sendKeysEmailInput('email');
//clicking on the next button for the email input
loginPage.getEmailNextButton().click();
await browser.wait(EC.presenceOf(loginPage.getPasswordInput()), 300000);
let id = await loginPage.getPasswordInput().getAttribute('id');
await browser.wait(EC.elementToBeClickable(element(by.name(id))), 300000);
//writing my password into password input
await element(by.name(id)).sendKeys('password');
//waiting for the next button for the password input to become clickabe
await browser.wait(EC.elementToBeClickable(element(by.id('passwordNext'))), 5000);
await browser.wait(EC.presenceOf(element(by.id('passwordNext'))), 5000);
//trying to click on next button for the password input and getting an error
await element(by.id('passwordNext')).click();
} catch (expection) {
console.error(expection);
}
});
});
conf.js
exports.config = {
seleniumAddress: 'http://localhost:4444/wd/hub',
onPrepare : function() {
// browser.manage().window().setSize(1600, 1000);
browser.manage().window().maximize();
},
capabilities: {
'browserName': 'chrome'
},
specs: ['specs/google-accounts-spec.js'],
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 3000000,
}
};
login-page.js 我正在使用 PageObject 模式(login-page 是一个页面对象)
var loginPage = function () {
var emailInput = element(by.id('identifierId'));
var passwordInput = element(by.id('password'));
var emailNextButton = element(by.id('identifierNext')).element(by.tagName('span'));
this.sendKeysEmailInput = async function(keys) {
await emailInput.clear().sendKeys(keys);
};
this.getPasswordInput = function () {
return passwordInput;
};
this.sendKeysPasswordInput = async function(keys) {
await passwordInput.clear().sendKeys(keys);
};
this.getEmailNextButton = function(){
return emailNextButton;
}
};
module.exports = new loginPage();
当我尝试点击下一步按钮输入密码时出现错误
{ WebDriverError: unknown error: Element ... is not clickable at point (1100, 527). Other element would receive the click:
它说该元素不可点击,但之前在代码中我一直在等待它变为可点击。所以我就是不明白,这个元素怎么不能点击。
我也尝试在 conf.js 的 onPrepare 中最大化 window 但仍然出现相同的错误。
奇怪的是,我并不是一直都遇到这个错误,它发生在 3 次尝试中的 1 次。我想那是因为我的网速高。
我知道有一种简单的方法可以通过编写 browser.sleep() 来解决这个问题,但我认为有更好更快的解决方案,因为使用 browser.wait() 你可以等待比你实际应该做的要多得多,因此,我的程序会变得更慢。
这可能是由于您希望单击的元素被包裹。
例如,您希望单击 'input',但必须单击他的包装器 'div',并且在这种情况下可能会引发错误。
要绕过这个问题,可以点击wrapper或者执行JS点击。
export async function jsClickButton(button: ElementFinder) {
try {
return await browser.executeScript('arguments[0].click()', button).then(async() => {
console.log('Element has been clicked.');
});
} catch (error) {
console.log('Element could not be clicked', error);
}
}
首先 browser.waitForAngularEnabled 与 browser.ignoreSynchronization 相同,最后一个从量角器 5.1 及更高版本中删除。从您的代码中删除任何一个。
然后您将 promises 与异步函数混合在一起。因此应该是 await browser.waitForAngularEnabled(false); await browser.get()
而且你在 loginPage.getEmailNextButton
之前错过了 await
。这很可能导致了您的问题。
最后你的消息说 WebDriverError: unknown error: Element ... is not clickable at point (1100, 527). Other element would receive the click:
。看看哪个元素实际上获得了点击,如果它真的阻止你与你的元素交互,看看你是否需要关闭该元素或做任何其他事情。