繁体   English   中英

如何在没有 autoit 和 url 方法的情况下使用 java 处理带有 selenium webdriver 的浏览器的身份验证警报

[英]How to handle authentication alert of browser with selenium webdriver using java without autoit and url method

我试图设置代理

Proxy proxy = new Proxy();
proxy.setHttpProxy("http://MY_USERNAME:MY_PASSWORD@MY_HOST:MY_PORT");

它正在重定向到特定的 URL,但实际上并没有设置代理,而是给我本地 IP,而不是 MY_HOST。

我不能使用 autoit 脚本。

请指导我如何处理警报框

在此处输入图片说明

我试过driver.switchTo().alert(); 但是,在语句driver.get(MY_URL);之后代码driver.get(MY_URL); 当弹出窗口出现时。

注意:这两个选项(1)通过设置 crx 文件和(2)通过在带有主机和端口的 URL 中提供用户名和密码,都已成功进行身份验证,但请注意,它实际上并未按要求设置代理,而是提供了本地 IP

java.awt.Robot类可用于身份验证

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;

login() throws Exception {
    // Pass username
    autoType(username);
    // to move to Password field
    autoTab();
    // Enter Password
    autoType(password);
    // To click on login
    autoSubmit();
}

private static void autoType(String string) throws AWTException {
    Robot robot = new Robot();
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    StringSelection stringSelection = new StringSelection(string);
    clipboard.setContents(stringSelection, null);
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
}

private static void autoTab() throws AWTException {
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_TAB);
    robot.keyRelease(KeyEvent.VK_TAB);
}

private static void autoSubmit() throws AWTException {
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
}

您可以创建一个可以即时处理代理的 Chrome 扩展程序。 ChromeDriver 不提供任何处理需要凭据的 HTTP 代理的功能。

创建一个包含以下 2 个文件的 zip 文件proxyExtension.zip

背景.js

var config = {
    mode: "fixed_servers",
    rules: {
      singleProxy: {
        scheme: "http",
        host: "YOU_PROXY_ADDRESS",
        port: parseInt(YOUR_PROXY_PORT)
      },
      bypassList: ["foobar.com"]
    }
  };

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {
    return {
        authCredentials: {
            username: "YOUR_PROXY_USERNAME",
            password: "YOUR_PROXY_PASSWORD"
        }
    };
}

chrome.webRequest.onAuthRequired.addListener(
        callbackFn,
        {urls: ["<all_urls>"]},
        ['blocking']
);

YOU_PROXY_ADDRESSYOUR_PROXY_PORTYOUR_PROXY_USERNAMEYOUR_PROXY_PASSWORD字段将替换为您的信息。

清单文件

{
    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
        "proxy",
        "tabs",
        "unlimitedStorage",
        "storage",
        "<all_urls>",
        "webRequest",
        "webRequestBlocking"
    ],
    "background": {
        "scripts": ["background.js"]
    },
    "minimum_chrome_version":"22.0.0"
}

然后,使用以下代码初始化 webdriver;

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addExtensions(new File("path_to_extension_file/proxyExtension.zip"));
WebDriver driver = new ChromeDriver(chromeOptions);

请将path_to_extension_file更改为包含proxyExtension.zip文件的目录。

您还可以在 链接上找到更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM