量角器点不可点击

时间:2018-12-16 15:26:40

标签: javascript async-await protractor qa clickable

我正在尝试使用量角器登录到Google帐户

google-account-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:未知错误:元素...在点(1100,527)上不可单击。   其他元素将获得点击:

它表示该元素不可单击,但是以前在代码中我一直在等待它变为可单击。所以我不明白,该元素怎么会不可点击。

我也尝试在conf.js的onPrepare中最大化窗口,但仍然遇到相同的错误。

奇怪的是,我一直都没有收到此错误,它像3次尝试中的1次一样发生。我想那是因为我的网速很高。

我知道有一种简单的方法可以解决此问题,只需编写browser.sleep(),但我认为有一个更好,更快的解决方案,因为使用browser.wait()可以比实际需要的时间多得多结果,我的程序就会变慢得多。

2 个答案:

答案 0 :(得分:1)


由于您希望单击的元素被包装,因此可能会发生这种情况。 例如,您希望单击“输入”,但必须单击其包装器“ div”,在这种情况下可能会引发错误。 要绕过此问题,可以单击包装器或执行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);
    }
}

答案 1 :(得分:0)

首先,browser.waitForAngularEnabled与browser.ignoreSynchronization相同,最后一个从量角器5.1及更高版本中删除。从您的代码中删除一个。

然后,您将诺言与异步功能混在一起。因此应该是await browser.waitForAngularEnabled(false); await browser.get(),并且您在await之前错过了loginPage.getEmailNextButton。这很可能引起了您的问题。

最后,您的消息说WebDriverError: unknown error: Element ... is not clickable at point (1100, 527). Other element would receive the click:。掠夺一个元素实际上获得点击的机会,如果它确实阻止您与该元素进行交互,请查看是否需要关闭该元素或执行其他任何操作。