JavaScript。硒。隐式等待和 driver.sleep 不能一起工作

问题描述 投票:0回答:1

我有一个糟糕的 Twitter 登录自动化脚本。我已经在 21 行设置了等待,并编写了在 34 行等待的脚本。但是第 34 行的 driver.sleep 不起作用

'use strict';
const {Browser,Builder, By, Key} = require('selenium-webdriver');
const config = require('./config');
const {TOTP} = require('totp-generator');

function getRandomNum() {
    const min = 5000;
    const max = 10000;
    return Math.random() * (max - min) + min;
}

function getToptpToken() {
    const { otp, expires } = TOTP.generate(config.twitter.toptp.token);
    return otp;
}

async function twitterLogin() {
    const url = 'https://x.com/i/flow/login';
    const driver = await new Builder().forBrowser(Browser.CHROME).build();
    try{
        await driver.manage().setTimeouts({ implicit: 20000 });
        await driver.get(url)
        const username = await driver.findElement(By.xpath("//input[@autocomplete='username']"));
        await username.sendKeys(config.twitter.login);
        await username.sendKeys(Key.RETURN);
        const phoneNumber = await driver.findElement(By.xpath("//input"));
        await phoneNumber.sendKeys(config.twitter.phone);
        await phoneNumber.sendKeys(Key.RETURN);
        const password = await driver.findElement(By.xpath("//input[@autocomplete='current-password']"));
        await password.sendKeys(config.twitter.pass);
        await password.sendKeys(Key.RETURN);
        const totpToken = await driver.findElement(By.xpath("//input"));
        await totpToken.sendKeys(Key.RETURN);
        await driver.sleep(getRandomNum());
    } catch (error){
        if(error === 'NoSuchElementError'){
            console.error(error.message);
        }
    }finally {
        await driver.quit();
    }
}

twitterLogin()

我用谷歌搜索,尝试了不同的等待组合......


UPD。可以关闭

  1. 修复了 getRandomNum
  2. 问题是 - twitter acc 2fa 被禁用。脚本应该可以处理这个问题
javascript selenium-webdriver wait sleep
1个回答
0
投票

您在 Twitter 登录自动化脚本中遇到的问题,特别是第 34 行的 driver.sleep 函数不起作用,可能是由于您的 Twitter 帐户禁用了双因素身份验证 (2FA)。您的脚本是在假设已启用 2FA 的情况下编写的,因此不需要在字段中输入 2FA 代码。

'use strict';
const {Browser,Builder, By, Key} = require('selenium-webdriver');
const config = require('./config');
const {TOTP} = require('totp-generator');

function getRandomNum() {
    const min = 5000;
    const max = 10000;
    return Math.random() * (max - min) + min;
}

function getToptpToken() {
    const { otp, expires } = TOTP.generate(config.twitter.toptp.token);
    return otp;
}

async function twitterLogin() {
    const url = 'https://x.com/i/flow/login';
    const driver = await new Builder().forBrowser(Browser.CHROME).build();
    try{
        await driver.manage().setTimeouts({ implicit: 20000 });
        await driver.get(url)
        const username = await driver.findElement(By.xpath("//input[@autocomplete='username']"));
        await username.sendKeys(config.twitter.login);
        await username.sendKeys(Key.RETURN);
        const phoneNumber = await driver.findElement(By.xpath("//input"));
        await phoneNumber.sendKeys(config.twitter.phone);
        await phoneNumber.sendKeys(Key.RETURN);

        // 2FA check
        try {
            const twoFactorAuthField = await driver.findElement(By.xpath("//input[@id='challenge_response']")); // Update the XPath for the 2FA code field
            if (twoFactorAuthField) {
                const totpToken = getToptpToken();
                await twoFactorAuthField.sendKeys(totpToken);
                await twoFactorAuthField.sendKeys(Key.RETURN);
            }
        } catch (error) {
            // 2FA field not found, continue
        }

        const password = await driver.findElement(By.xpath("//input[@autocomplete='current-password']"));
        await password.sendKeys(config.twitter.pass);
        await password.sendKeys(Key.RETURN);

        await driver.sleep(getRandomNum()); // Random delay
    } catch (error){
        if(error.name === 'NoSuchElementError'){
            console.error(error.message);
        }
    }finally {
        await driver.quit();
    }
}

twitterLogin()

在此代码中,我们添加了一个

try...catch
块来检查 2FA 代码字段是否存在。如果该字段存在,我们使用
getToptpToken()
函数获取 2FA 代码并将其输入该字段。如果没有,代码将继续下一步。

我们还确保使用

driver.sleep()
函数调用
getRandomNum()
函数以使用随机延迟时间。

© www.soinside.com 2019 - 2024. All rights reserved.