#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;
}