Selenium用法详解弹框处理JAVA爬虫
Posted 洛阳泰山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Selenium用法详解弹框处理JAVA爬虫相关的知识,希望对你有一定的参考价值。
简介
本文主要讲解,java代码利用selenium 控制chrome浏览器中alert (警告框)、confirm(确认框)、prompt(输入框)的代码教程。
弹框处理
javascript 有三种弹窗 alert(确认)、confirm(确认、取消)、prompt(文本框、确认、取消)。
处理方式:先定位(driver.switchTo().alert()自动获取当前弹窗),再使用 text、accept、dismiss、send_keys 等方法进行操作。
方法 | 描述 |
text | 获取弹窗中的文字 |
accept | 接受(确认)弹窗内容 |
dismiss | 解除(取消)弹窗 |
sendKeys | 发送文本至警告框 |
这里写一个简单的测试页面,其中包含三个按钮,分别对应三个弹窗。
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<button id="alert">alert</button>
<button id="confirm">confirm</button>
<button id="prompt">prompt</button>
<script type="text/javascript">
const dom1 = document.getElementById("alert")
dom1.addEventListener('click', function()
alert("alert hello")
)
const dom2 = document.getElementById("confirm")
dom2.addEventListener('click', function()
confirm("confirm hello")
)
const dom3 = document.getElementById("prompt")
dom3.addEventListener('click', function()
prompt("prompt hello")
)
</script>
</body>
</html>
下面使用上面的方法进行测试。为了防止弹窗操作过快,每次操作弹窗,都使用 sleep 强制等待一段时间。
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.event.KeyEvent;
import java.io.IOException;
public class SeleniumDemo
private final static String webDriver = "webdriver.chrome.driver";
private final static String webDriverPath ="E:\\\\chromedriver\\\\chromedriver.exe";
public static void main(String[] args) throws InterruptedException, IOException, AWTException
System.setProperty(webDriver, webDriverPath);
WebDriver driver= new ChromeDriver();
driver.get("file:///C:/Users/liuya/Desktop/test.html");
Thread.sleep(2000);
//点击alert按钮
driver.findElement(By.xpath("//*[@id='alert']")).click();
Thread.sleep(2000);
Alert alert= driver.switchTo().alert();
//打印alert弹窗文本
System.out.println(alert.getText());
//确认
alert.accept();
Thread.sleep(2000);
//点击confirm按钮
driver.findElement(By.xpath("//*[@id='confirm']")).click();
Thread.sleep(2000);
Alert confirm= driver.switchTo().alert();
//打印confirm弹窗文本
System.out.println(confirm.getText());
//确认
// confirm.accept();
//取消
confirm.dismiss();
Thread.sleep(2000);
//点击prompt按钮
driver.findElement(By.xpath("//*[@id='prompt']")).click();
Thread.sleep(2000);
Alert prompt= driver.switchTo().alert();
System.out.println(prompt);
//打印confirm弹窗文本
System.out.println(prompt.getText());
Thread.sleep(2000);
//Chrome 不支持这个方法,其他Firefox 、ie等支持
// prompt.sendKeys("tarzan");
//用java robot机器人写入(缺点是不能动浏览器)
keyPressString(new Robot(),"tarzan");
Thread.sleep(2000);
//打印confirm弹窗文本
System.out.println(prompt.getText());
//确认
prompt.accept();
//输入字符串
public static void keyPressString(Robot r, String str)
//获取剪切板
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
//将传入字符串封装下
Transferable tText = new StringSelection(str);
//将字符串放入剪切板
clip.setContents(tText, null);
//按下Ctrl+V实现粘贴文本
keyPressWithCtrl(r, KeyEvent.VK_V);
r.delay(100);
//Ctrl组合键
public static void keyPressWithCtrl(Robot r, int key)
r.keyPress(KeyEvent.VK_CONTROL);
r.keyPress(key);
r.keyRelease(key);
r.keyRelease(KeyEvent.VK_CONTROL);
r.delay(100);
注:经过测试时发现执行 prompt 的 sendKeys 时,不能将文本填入输入框。尝试了各种方法并查看源码,百度寻求答案后,基本确认Chrome 浏览器不支持selenium alert的sendKeys() 方法,我代码中用java robot 进行输入文本,这样做的缺点是不能动浏览器,不然有可能输入到别的地方了。selenium alert的sendKeys() 改用 Firefox 可成功运行。
以上是关于Selenium用法详解弹框处理JAVA爬虫的主要内容,如果未能解决你的问题,请参考以下文章