Скрипт для двухфакторной аутентификации для получения кода из локальной БД

#java #database #selenium #two-factor-authentication

Вопрос:

Мое приложение требует автоматизации. сначала он автоматически вводит имя пользователя и пароль и нажимает кнопку входа в систему, затем код OTP, который уже хранится в базе данных, и он автоматически извлекает статический код OTP из базы данных и вводит в текстовое поле OTP, затем позволяет пользователю войти в приложение. если у вас есть сценарий автоматизации, пожалуйста, предоставьте его.

Комментарии:

1. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.

Ответ №1:

JDBC не поддерживает подключение к локальной БД. Мой обходной путь заключается в использовании утилиты SQL CMD.

 public static String localdbInstanceName = "YOUR LOCAL DB INSTANCE NAME";
public static String sqlCmdCommandPreffix = "sqlcmd -S "   localdbInstanceName   " -E -d master -Q ";

// method to recieve result text from CMD command 
public static List<String> getCmdResults(String command, Boolean wait, Boolean printResults, Boolean printErrors) {
    int exitCode = - 1;
    List<String> results = new ArrayList<String>();
    Process process;
    BufferedReader bufferedReader;
    InputStreamReader inputStreamReader;
    String p1 = null;
    String p2 = null;
    try {
        process = Runtime.getRuntime().exec(command);
        inputStreamReader = new InputStreamReader(process.getInputStream());
        bufferedReader = new BufferedReader(inputStreamReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            if (line.trim().length() > 0) {
                results.add(line.trim());
            }
        }
        p1 = System.lineSeparator()   command   System.lineSeparator()   System.lineSeparator();
        p2 = String.join(System.lineSeparator(), results)   System.lineSeparator()   System.lineSeparator();
        if (printResults) {
            log.info(p1   p2);
        }
        if (wait) {
            try {
                exitCode = process.waitFor();
            } catch (InterruptedException e) {                  
            }
        }
        else {
            exitCode = process.exitValue();
        }
        if (exitCode != 0 amp;amp; printErrors) {
            log.error(p1   p2);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return results;
}

    // example with specific query
    public static String getStartOnStartPage(String dbName, String userId, String regId) {
        String q1 = "SELECT Value FROM ["   dbName   "].[dbo].[Parameter] ";
        String q2 = "WHERE Variable = 'StartOnStartPage' AND UserId = "   userId   " AND IdRegistrace = "   regId   ";";
        List<String> results = getCmdResults(sqlCmdCommandPreffix   """   q1   q2   """, false, false, true);
        if (results.size() > 0) {
            return results.get(0);
        }
        else {
            return null;
        }
    }
 

Для SQL Server express вы можете использовать это:

 public static List<String> getSqlResults(Connection connection, String query, String key) {
    List<String> results = new ArrayList<String>();
    try {
        Statement statement = connection.createStatement();
        statement.setQueryTimeout(60);
        ResultSet result = statement.executeQuery(query);
        while (result.next()) {
            results.add(result.getString(key));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return results;
}

public static Map<String, String> mapSqlResults(Connection connection, String query, String key, String value) {
    Map<String, String> map = new HashMap<String, String>();
    ResultSet result = null;
    try {
        result = connection.createStatement().executeQuery(query);
        while (result.next()) {
            map.put(result.getString(key), result.getString(value));
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return map;
}