如何使用带有 Java 的 Selenium 从输出控制台或输出文本文件中提取特定字符串
How to Extract particular String from Output console or output text file using Selenium with Java
我已经将网站的网络日志打印为控制台输出(Selenium with Java)并尝试从控制台中提取授权持有者令牌。
输出很大,试图只提取 Auth 承载。
我试图将输出放在 txt 文件中并提取,但整行提取的不是特定的身份验证持有者。
如何获得?
我已将日志存储在 txt 文件中并尝试通过以下方式获取。
public class BufferedReaderExample {
public static void main(String args[])throws Exception
{
// BufferedReader br = new BufferedReader(new FileReader("ModellerOutput.txt"));
LineNumberReader reader= new LineNumberReader(new FileReader("E:\consoledata.txt"));
String line;
while ((line = reader.readLine()) != null)
{
if(line.contains("Bearer"))
{
System.out.println(reader.getLineNumber());
// for(int i=reader.getLineNumber();i<=(reader.getLineNumber()+50);i++)
// {
// System.out.println(reader.getLineNumber());
String line1 = Files.readAllLines(Paths.get("E:\consoledata.txt")).get(reader.getLineNumber());
// System.out.println(line1.startsWith("Bearer"));//true
// System.out.println(line1.endsWith(","));
System.out.println(line1);
}
}
}
}
{"webview":"92072A77A4E7CE70B654162022145D0A",
"message":{"method":"Network.requestWillBeSent",
"params":{"request":{"headers":{"Authorization":"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhTmsifQ.eyJleHAiOjE2MjQ5NzAyNTAsIm5iZiI6MTYyNDk2NjY1MCwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly90ZWxzdHJhc21hcnRzcGFjZXNiMmNkZXYuYjJjbG9naW4uY29tL2M4OTJmNmExLTZjZjEtNDJlNi04YWQ5LTAyMzUwNTJmYzc0NS92Mi4wLyIsInN1YiI6IjZlNjVhOTE4LTU4NmUtNDQ4ZC1iZjVhLTk1OGJmNzBmOWQ5NSIsImF1ZCI6IjE4MWZlOWU2LWUyYWYtNGFhYi04OTgwLWI2Zjk2OTExYWQzNiIsIm5vbmNlIjoiM2ZkZjQ0MjUtMTNhNS00MWYxLThhZDItYjczMDdjNDY4MmFkIiwiaWF0IjoxNjI0OTY2NjUwLCJhdXRoX3RpbWUiOjE2MjQ5NjY2NTAsImlkcCI6Imh0dHBzOi8vc2EudGh5cmEudGVsc3RyYS5jb20vU2VjdXJlQXV0aDU4NyIsImdpdmVuX25hbWUiOiJHYXVyYXYiLCJmYW1pbHlfbmFtZSI6IlNyaXZhc3RhdmEiLCJuYW1lIjoiU3JpdmFzdGF2YSwgR2F1cmF2Iiwib2lkIjoiNmU2NWE5MTgtNTg2ZS00NDhkLWJmNWEtOTU4YmY3MGY5ZDk1IiwidGZwIjoiQjJDXzFfbXl3b3JrcGxhY2Vfd2ViYXBwIn0.kpqB7mfgxp8oNpga7AciHanayHdJOQDcjT9zDhQDYHmLl-bkWjVQfhJQvwm5K94kFiarlDTkRBjabtD3h0we_D1DR8Wmq1t7qm2a52vUqNjBeNN23rn0ST56MgqiFTa9VITVmURxscXz38ZFCciTO7JCaO1Yj_bhRCcMBeFDvV8Dr-f9y563iTeu6BagRJjHwF_70N961DD_HqIkEAIB775RUkq5YouYuqBg-4zMUqRFXYdax0iKm7gEnFzqRq78DDlVNnyEKJEVyGyykUp4yhBsAYo7qIEk8OhrVwlvC0mTLmhisBtRjCM5K5lrv9ePcF0E6kHrSlIIRyHBKLtDYQ",
"sec-ch-ua":"\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"91\", \"Chromium\";v=\"91\"","sec-ch-ua-mobile":"?0","Accept":"application/json, text/plain,
您尝试处理的文本看起来像是 JSON 格式。
方法 1:使用 JSON 解析器
最干净的方法是使用 JSON 解析器(例如 GSON)解析文本。然后你可以导航数据对象并提取你想要的部分。
方法二:使用正则表达式
或者,您可以使用 regular expression 来提取您感兴趣的部分。这种方法有点麻烦,但这对您的情况可能无关紧要。像这样:
String s = "{\"webview\":\"92072A77A4E7CE70B654162022145D0A\",\n"
+ "\"message\":{\"method\":\"Network.requestWillBeSent\",\n"
+ "\"params\":{\"request\":{\"headers\":{\"Authorization\":\"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhTmsifQ.eyJleHAiOjE2MjQ5NzAyNTAsIm5iZiI6MTYyNDk2NjY1MCwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly90ZWxzdHJhc21hcnRzcGFjZXNiMmNkZXYuYjJjbG9naW4uY29tL2M4OTJmNmExLTZjZjEtNDJlNi04YWQ5LTAyMzUwNTJmYzc0NS92Mi4wLyIsInN1YiI6IjZlNjVhOTE4LTU4NmUtNDQ4ZC1iZjVhLTk1OGJmNzBmOWQ5NSIsImF1ZCI6IjE4MWZlOWU2LWUyYWYtNGFhYi04OTgwLWI2Zjk2OTExYWQzNiIsIm5vbmNlIjoiM2ZkZjQ0MjUtMTNhNS00MWYxLThhZDItYjczMDdjNDY4MmFkIiwiaWF0IjoxNjI0OTY2NjUwLCJhdXRoX3RpbWUiOjE2MjQ5NjY2NTAsImlkcCI6Imh0dHBzOi8vc2EudGh5cmEudGVsc3RyYS5jb20vU2VjdXJlQXV0aDU4NyIsImdpdmVuX25hbWUiOiJHYXVyYXYiLCJmYW1pbHlfbmFtZSI6IlNyaXZhc3RhdmEiLCJuYW1lIjoiU3JpdmFzdGF2YSwgR2F1cmF2Iiwib2lkIjoiNmU2NWE5MTgtNTg2ZS00NDhkLWJmNWEtOTU4YmY3MGY5ZDk1IiwidGZwIjoiQjJDXzFfbXl3b3JrcGxhY2Vfd2ViYXBwIn0.kpqB7mfgxp8oNpga7AciHanayHdJOQDcjT9zDhQDYHmLl-bkWjVQfhJQvwm5K94kFiarlDTkRBjabtD3h0we_D1DR8Wmq1t7qm2a52vUqNjBeNN23rn0ST56MgqiFTa9VITVmURxscXz38ZFCciTO7JCaO1Yj_bhRCcMBeFDvV8Dr-f9y563iTeu6BagRJjHwF_70N961DD_HqIkEAIB775RUkq5YouYuqBg-4zMUqRFXYdax0iKm7gEnFzqRq78DDlVNnyEKJEVyGyykUp4yhBsAYo7qIEk8OhrVwlvC0mTLmhisBtRjCM5K5lrv9ePcF0E6kHrSlIIRyHBKLtDYQ\",\n"
+ "\"sec-ch-ua\":\"\\" Not;A Brand\\";v=\\"99\\", \\"Google Chrome\\";v=\\"91\\", \\"Chromium\\";v=\\"91\\"\",\"sec-ch-ua-mobile\":\"?0\",\"Accept\":\"application/json, text/plain, \n"
+ "";
Pattern bearerPattern = Pattern.compile("\"Bearer ([^\"]+)\"");
Matcher matcher = bearerPattern.matcher(s);
matcher.find();
String token = matcher.group(1);
System.out.println(token);
打印:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1 ... lIIRyHBKLtDYQ
方法三:使用indexOf和substring
或者,类似于 Gautham 的回答,您可以使用 indexOf
和 substring
:
String prefix = "Bearer ";
int i = s.indexOf(prefix);
String token = s.substring(i + prefix.length(), s.indexOf("\"", i));
这与 Gautham 的回答略有不同,因为它使用 indexOf(String str, int fromIndex)
来查找引用的位置,这避免了执行两次 substring
的需要。
@ELEVATE 的回答似乎更好。我正在分享一个解决方案,您可以使用 String
中的方法来完成
String bearer = "Bearer";
int index = line1.indexOf(bearer);
String token = line.substring(index + bearer.length() + 1);
token = token.substring(0, token.indexOf('"'));
我已经将网站的网络日志打印为控制台输出(Selenium with Java)并尝试从控制台中提取授权持有者令牌。 输出很大,试图只提取 Auth 承载。
我试图将输出放在 txt 文件中并提取,但整行提取的不是特定的身份验证持有者。 如何获得?
我已将日志存储在 txt 文件中并尝试通过以下方式获取。
public class BufferedReaderExample {
public static void main(String args[])throws Exception
{
// BufferedReader br = new BufferedReader(new FileReader("ModellerOutput.txt"));
LineNumberReader reader= new LineNumberReader(new FileReader("E:\consoledata.txt"));
String line;
while ((line = reader.readLine()) != null)
{
if(line.contains("Bearer"))
{
System.out.println(reader.getLineNumber());
// for(int i=reader.getLineNumber();i<=(reader.getLineNumber()+50);i++)
// {
// System.out.println(reader.getLineNumber());
String line1 = Files.readAllLines(Paths.get("E:\consoledata.txt")).get(reader.getLineNumber());
// System.out.println(line1.startsWith("Bearer"));//true
// System.out.println(line1.endsWith(","));
System.out.println(line1);
}
}
}
}
{"webview":"92072A77A4E7CE70B654162022145D0A",
"message":{"method":"Network.requestWillBeSent",
"params":{"request":{"headers":{"Authorization":"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhTmsifQ.eyJleHAiOjE2MjQ5NzAyNTAsIm5iZiI6MTYyNDk2NjY1MCwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly90ZWxzdHJhc21hcnRzcGFjZXNiMmNkZXYuYjJjbG9naW4uY29tL2M4OTJmNmExLTZjZjEtNDJlNi04YWQ5LTAyMzUwNTJmYzc0NS92Mi4wLyIsInN1YiI6IjZlNjVhOTE4LTU4NmUtNDQ4ZC1iZjVhLTk1OGJmNzBmOWQ5NSIsImF1ZCI6IjE4MWZlOWU2LWUyYWYtNGFhYi04OTgwLWI2Zjk2OTExYWQzNiIsIm5vbmNlIjoiM2ZkZjQ0MjUtMTNhNS00MWYxLThhZDItYjczMDdjNDY4MmFkIiwiaWF0IjoxNjI0OTY2NjUwLCJhdXRoX3RpbWUiOjE2MjQ5NjY2NTAsImlkcCI6Imh0dHBzOi8vc2EudGh5cmEudGVsc3RyYS5jb20vU2VjdXJlQXV0aDU4NyIsImdpdmVuX25hbWUiOiJHYXVyYXYiLCJmYW1pbHlfbmFtZSI6IlNyaXZhc3RhdmEiLCJuYW1lIjoiU3JpdmFzdGF2YSwgR2F1cmF2Iiwib2lkIjoiNmU2NWE5MTgtNTg2ZS00NDhkLWJmNWEtOTU4YmY3MGY5ZDk1IiwidGZwIjoiQjJDXzFfbXl3b3JrcGxhY2Vfd2ViYXBwIn0.kpqB7mfgxp8oNpga7AciHanayHdJOQDcjT9zDhQDYHmLl-bkWjVQfhJQvwm5K94kFiarlDTkRBjabtD3h0we_D1DR8Wmq1t7qm2a52vUqNjBeNN23rn0ST56MgqiFTa9VITVmURxscXz38ZFCciTO7JCaO1Yj_bhRCcMBeFDvV8Dr-f9y563iTeu6BagRJjHwF_70N961DD_HqIkEAIB775RUkq5YouYuqBg-4zMUqRFXYdax0iKm7gEnFzqRq78DDlVNnyEKJEVyGyykUp4yhBsAYo7qIEk8OhrVwlvC0mTLmhisBtRjCM5K5lrv9ePcF0E6kHrSlIIRyHBKLtDYQ",
"sec-ch-ua":"\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"91\", \"Chromium\";v=\"91\"","sec-ch-ua-mobile":"?0","Accept":"application/json, text/plain,
您尝试处理的文本看起来像是 JSON 格式。
方法 1:使用 JSON 解析器
最干净的方法是使用 JSON 解析器(例如 GSON)解析文本。然后你可以导航数据对象并提取你想要的部分。
方法二:使用正则表达式
或者,您可以使用 regular expression 来提取您感兴趣的部分。这种方法有点麻烦,但这对您的情况可能无关紧要。像这样:
String s = "{\"webview\":\"92072A77A4E7CE70B654162022145D0A\",\n"
+ "\"message\":{\"method\":\"Network.requestWillBeSent\",\n"
+ "\"params\":{\"request\":{\"headers\":{\"Authorization\":\"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1RWQndhTmsifQ.eyJleHAiOjE2MjQ5NzAyNTAsIm5iZiI6MTYyNDk2NjY1MCwidmVyIjoiMS4wIiwiaXNzIjoiaHR0cHM6Ly90ZWxzdHJhc21hcnRzcGFjZXNiMmNkZXYuYjJjbG9naW4uY29tL2M4OTJmNmExLTZjZjEtNDJlNi04YWQ5LTAyMzUwNTJmYzc0NS92Mi4wLyIsInN1YiI6IjZlNjVhOTE4LTU4NmUtNDQ4ZC1iZjVhLTk1OGJmNzBmOWQ5NSIsImF1ZCI6IjE4MWZlOWU2LWUyYWYtNGFhYi04OTgwLWI2Zjk2OTExYWQzNiIsIm5vbmNlIjoiM2ZkZjQ0MjUtMTNhNS00MWYxLThhZDItYjczMDdjNDY4MmFkIiwiaWF0IjoxNjI0OTY2NjUwLCJhdXRoX3RpbWUiOjE2MjQ5NjY2NTAsImlkcCI6Imh0dHBzOi8vc2EudGh5cmEudGVsc3RyYS5jb20vU2VjdXJlQXV0aDU4NyIsImdpdmVuX25hbWUiOiJHYXVyYXYiLCJmYW1pbHlfbmFtZSI6IlNyaXZhc3RhdmEiLCJuYW1lIjoiU3JpdmFzdGF2YSwgR2F1cmF2Iiwib2lkIjoiNmU2NWE5MTgtNTg2ZS00NDhkLWJmNWEtOTU4YmY3MGY5ZDk1IiwidGZwIjoiQjJDXzFfbXl3b3JrcGxhY2Vfd2ViYXBwIn0.kpqB7mfgxp8oNpga7AciHanayHdJOQDcjT9zDhQDYHmLl-bkWjVQfhJQvwm5K94kFiarlDTkRBjabtD3h0we_D1DR8Wmq1t7qm2a52vUqNjBeNN23rn0ST56MgqiFTa9VITVmURxscXz38ZFCciTO7JCaO1Yj_bhRCcMBeFDvV8Dr-f9y563iTeu6BagRJjHwF_70N961DD_HqIkEAIB775RUkq5YouYuqBg-4zMUqRFXYdax0iKm7gEnFzqRq78DDlVNnyEKJEVyGyykUp4yhBsAYo7qIEk8OhrVwlvC0mTLmhisBtRjCM5K5lrv9ePcF0E6kHrSlIIRyHBKLtDYQ\",\n"
+ "\"sec-ch-ua\":\"\\" Not;A Brand\\";v=\\"99\\", \\"Google Chrome\\";v=\\"91\\", \\"Chromium\\";v=\\"91\\"\",\"sec-ch-ua-mobile\":\"?0\",\"Accept\":\"application/json, text/plain, \n"
+ "";
Pattern bearerPattern = Pattern.compile("\"Bearer ([^\"]+)\"");
Matcher matcher = bearerPattern.matcher(s);
matcher.find();
String token = matcher.group(1);
System.out.println(token);
打印:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1jNTdkTzZRR1 ... lIIRyHBKLtDYQ
方法三:使用indexOf和substring
或者,类似于 Gautham 的回答,您可以使用 indexOf
和 substring
:
String prefix = "Bearer ";
int i = s.indexOf(prefix);
String token = s.substring(i + prefix.length(), s.indexOf("\"", i));
这与 Gautham 的回答略有不同,因为它使用 indexOf(String str, int fromIndex)
来查找引用的位置,这避免了执行两次 substring
的需要。
@ELEVATE 的回答似乎更好。我正在分享一个解决方案,您可以使用 String
String bearer = "Bearer";
int index = line1.indexOf(bearer);
String token = line.substring(index + bearer.length() + 1);
token = token.substring(0, token.indexOf('"'));