Java Firefox auth弹出窗口获取错误:不支持promptUserAndPass类型的用户提示

Java Firefox auth弹出窗口获取错误:不支持promptUserAndPass类型的用户提示,java,selenium-webdriver,selenium-firefoxdriver,browsermob-proxy,Java,Selenium Webdriver,Selenium Firefoxdriver,Browsermob Proxy,我的身份验证功能在chrome中运行得很好,但由于Firefox的处理方式不同,我无论如何都无法登录身份验证 我的Firefox版本:72.02 我发现,这是已知的错误,但他们是1年前的帖子,如果有人有解决方案,请分享 正常的代码将不会像下面那样工作,因为我需要向url运行时添加令牌,就像chrome中所示,但不是Firefox中所示 driver.get("https://your-username:your-password@example.com"); 所以我需要在这种情况下做一些S

我的身份验证功能在chrome中运行得很好,但由于Firefox的处理方式不同,我无论如何都无法登录身份验证

我的Firefox版本:72.02

我发现,这是已知的错误,但他们是1年前的帖子,如果有人有解决方案,请分享

正常的代码将不会像下面那样工作,因为我需要向url运行时添加令牌,就像chrome中所示,但不是Firefox中所示

driver.get("https://your-username:your-password@example.com");
所以我需要在这种情况下做一些SendKey,这对我来说是失败的

我得到的错误如下:

线程“main”中出现异常 org.openqa.selenium.unsupportedCommand异常:类型为的用户提示 不支持promptUserAndPass生成信息:版本:“3.141.59”, 修订版:“e82be7d358”,时间:“2018-11-14T08:17:03”系统信息:主机: '',ip:'',os.name:'Windows 10',os.arch: 'amd64',os.version:'10.0',java.version:'1.8.0_66'驱动程序信息: org.openqa.selenium.firefox.FirefoxDriver

我正在尝试的代码:

public static void main(String[] args) throws InterruptedException, AWTException {

       /* BrowserMobProxy proxy = new BrowserMobProxyServer();
        proxy.start(0);
        Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);*/

        // put our custom header to each request
/*       proxy.addRequestFilter((request, contents, messageInfo)->{
            request.headers().add("my-test-header", "my-test-value");
            System.out.println(request.headers().entries().toString());
            return null;
        });*/

        // Setting up Proxy for chrome
      //  ChromeOptions opts = new ChromeOptions();




        WebDriver driver = null;
        String url = "https://qa.xyz-domain/new-request/";
        String UserName = "xyzuser";
        String Password = "xyz@202";

        System.setProperty("webdriver.gecko.driver",
                "D:\\Demoproject\\src\\main\\resources\\drivers\\geckodriver.exe");
        FirefoxOptions options = new FirefoxOptions();
         options.setCapability("network.http.phishy-userpass-length", 255);
         options.setCapability("network.automatic-ntlm-auth.trusted-uris","testcloud");
        // options.setp
    //   options.setCapability(CapabilityType.);


         String val=UserName+":"+Password;

         String encodedCreadentials = "Basic " + (Base64.getEncoder().encodeToString(val.getBytes()));

         options.setCapability("Authorization",encodedCreadentials);

        // String proxyOption = "--proxy-server=" + seleniumProxy.getHttpProxy();
       //  options.addArguments(proxyOption);
        // options.addArguments(arguments)
        driver = new FirefoxDriver(options);

        driver.get(url);
        Thread.sleep(5000);
        driver.findElement(By.name("loginfmt")).sendKeys("user.name@xyz.com");
        driver.findElement(By.name("loginfmt")).sendKeys(Keys.ENTER);
        Thread.sleep(15000);
        driver.switchTo().alert().sendKeys(UserName);
        /*BrowserMobProxy browserMobProxy = new BrowserMobProxyServer();


        browserMobProxy.addHeader("Authorization", encodedCreadentials);
        browserMobProxy.start();*/


        //ProxyServer bmp = new ProxyServer(4444);
    /*  Robot robot = new Robot();
        robot.keyPress(KeyEvent.VK_ENTER);
        driver.switchTo().alert().sendKeys(UserName);*/


/*      Alert alert = driver.switchTo().alert();

        System.out.println(alert.getText());

        if (alert.getText().contains("jjjj")) {*/
    //      alert.sendKeys("UserName");
            //driver.switchTo().alert().dismiss();;
            //driver.switchTo().alert().sendKeys(UserName + Keys.TAB + Password);
            //alert.sendKeys(UserName + Keys.TAB + Password);

            /*String url2 = driver.getCurrentUrl().replaceAll("https://", "");
            System.out.println("url2 = " + url2);

            String url3 = "https://" + UserName + ":" + Password + "@" + url2 + "/";
            System.out.println("url3 = " + url3);
            driver.get(url3);

            //driver.switchTo().alert().sendKeys(UserName + Keys.TAB + Password);
            //driver.switchTo().alert().accept();

            String url2 = driver.getCurrentUrl().replaceAll("https://", "");
            System.out.println("url2 = " + url2);

            String url3 = "https://" + UserName + ":" + Password + "@" + url2 + "/";
            System.out.println("url3 = " + url3);
            driver.get(url3);*/

        /*} else {
            System.out.println("not appearing");
        }*/



    }

}
我尝试使用BrowserMobProxy,但我相信它只适用于http请求,我想,对于https har,如果我的理解有问题,请告诉我。或者我们可以将其用于https

参考:


由于缺少规范,他们似乎还没有开始修复此问题。 然而,我发现了一个自动绕过此验证的技巧

您需要导入
threading
win32api
win32con

首先,使用第一个线程启动浏览器,打开要操作的页面

当显示用于输入用户和密码的输入框时,按住页面并同时启动另一个线程

在第二个线程中,调用Python键盘事件,通过tab输入用户名和密码,然后输入

例如:

    def input_auth(self):
        time.sleep(10)
        for i in 'account':
            type_key(i)
        type_key('TAB')
        for i in 'password':
            type_key(i)
        type_key('ENTER')

    def get_url(self, driver, url):
        driver.get(url)
     
    def type_key(self, key):
        win32api.keybd_event(int(self.keyboard[key]),0,0,0)
        win32api.keybd_event(int(self.keyboard[key]),0,win32con.KEYEVENTF_KEYUP,0)
    
    def run(self,driver,url):
        thread_get_url = threading.Thread(target=self.get_url,args=[driver,url])
        thread_input_auth= threading.Thread(target=self.input_auth)
        thread_get_url .start()
        thread_input_auth.start()
        thread_get_url .join()
        thread_input_auth.join()
参考: