Элемент транспортира не активируется в точке - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь войти в учетную запись 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).Другой элемент получит щелчок:

Он говорит, что элемент не активен, но ранее в коде, который я ожидал, он стал активным.Так что я просто не понимаю, как этот элемент не может быть кликабелен.

Я также попытался развернуть окно в onPrepare в conf.js, но все равно получил ту же ошибку.Дело в том, что я не получаю эту ошибку все время, это происходит как в 1 из 3 попыток.Я полагаю, это из-за моей высокой скорости интернета.

Я знаю, что есть простой способ решить эту проблему, просто написав browser.sleep (), но я думаю, что есть лучшее и более быстрое решение, потому что с браузером.wait () вы можете ждать намного больше, чем на самом деле следовало бы, в результате моя программа стала бы намного медленнее.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Прежде всего 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:.Возьмите лут, какой элемент действительно получает щелчок, и если он действительно мешает вам взаимодействовать с вашим элементом, посмотрите, нужно ли вам закрыть этот элемент или сделать что-нибудь еще.

0 голосов
/ 16 декабря 2018


это может произойти, потому что элемент, на который вы хотите нажать, обернут.Например, вы хотите нажать «input», но его оболочка «div» должна быть нажата, и в этом случае может выдать ошибку.Чтобы обойти эту проблему, вы можете щелкнуть оболочку или выполнить JS click.

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);
    }
}
...