如何在selenium webdriver中处理浏览器的身份验证警报?

时间:2017-02-21 04:52:51

标签: selenium authentication selenium-webdriver automation

有谁知道我们如何在selenium Webdriver中处理浏览器的Authenticate警告框?

我使用以下代码,但无效。

driver.switchTo().alert().authenticateUsing(new UserAndPassword("uname", "Password"));

以下是我要填写的内容的屏幕截图:

有谁知道如何输入这些凭证?

3 个答案:

答案 0 :(得分:0)

这样的东西?

driver.Navigate().to("http://UserName:Password@url.‌​com")

WebDriverWait wait = new WebDriverWait(driver, 10);      
Alert alert = wait.until(ExpectedConditions.alertIsPresent());     
alert.authenticateUsing(new UserAndPassword(*username*, *password*));

答案 1 :(得分:0)

您可以通过两种方式处理此问题:

  1. 您可以直接通过以下网址传递用户名和密码:

    driver..get("https://MyUserName:password@staging.www.abc.com")
    
  2. 您还可以使用AutoIT Tool处理任何类型的窗口弹出窗口。

    您可以在其中编写脚本,也可以使用Au3Recorder。它不适用于SciTE的新版本,但您可以分别从旧版本download获取它。解压缩并复制:

    autoit-v3.3.14.0.zip\install\Extras\Au3Record
    

    [@Install Dir of AutoIt in Program files]\Extras\Au3Record
    
  3. 现在您可以通过单击 Au3Record.exe 直接启动录像机,或者您可以在“脚本编辑器”窗口中找到它工具> AU3Recorder

    对于它,您必须在脚本编辑器中创建一个空白的 .au3 文件。现在开始录音。在Window Popup上执行操作。完成时停止。使用 .au3 格式保存。

    现在转到已保存的文件位置>>右键单击文件并编译它(编译脚本(x64)或其他)。它将在同一文件夹中创建 .exe 文件。现在使用以下命令在项目中运行该脚本:

    Runtime.getRuntime().exec("File Loaction/MyAutoItScript.exe");
    

    它会起作用。

答案 2 :(得分:0)

我将Java用于自动化测试。我正在寻找一种体面的方法来处理这些弹出窗口中的信息,但找不到。最常见的答案是在URL中包含真实URL之前的前缀(例如https:\ username:password@www.website.com),或者使用等待警报。这些对我不起作用,因为:在提交表单时,没有简单的URL可供使用,并且我不确定URL开头的安全性(包括密码);在等待警报的情况下,Webdriver会挂起,直到出现响应-仅来自通过弹出窗口提交登录响应。

我发现的解决方法很差-我没有让它在无头的环境中工作,因此限制了此答案的用处。在这里获得真实的答案将是很棒的。请注意,我在Windows环境中运行此程序,并且如果我使用Linux,我已经阅读到可以使用xvfb为sikuli提供一个“屏幕”,然后该方法就可以工作-如果有人可以评论如何在Windows上执行此操作服务器,将不胜感激。

我将Sikuli用于无法通过Selenium自动化的事物的自动化。 Sikuli做很多事情,包括让您从根本上提供对其执行操作的图像。  为此,我在单击导致登录的提交的弹出窗口之前启动的线程上运行Sikuli。由于它在不同的线程上运行,因此不会阻塞主线程,因此它仍可以执行登录。登录后,它将关闭并登录,将关闭弹出窗口并重新激活主线程。

特别是:

POM的Sikuli MAVEN条目:

<dependency>
    <groupId>com.sikulix</groupId>
    <artifactId>sikulixapi</artifactId>
    <version>1.1.4-20191010.160947-268</version>
</dependency>    

在主代码中,使用通过执行程序执行的runnable:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
private final AtomicInteger expectedResultCount;
private final AtomicInteger publishedResultCount;    
private final ExecutorService executor; 
ExecutorService executor = Executors.newFixedThreadPool(5); 
String processName = "asic-login";
LoginPopUp login = new LoginPopUp(this, processName);
addResultExpectation(processName);
executor.execute(login);

这里的runnable实现了我用来保持整洁的接口:

主类实现用于管理线程的接口:

public class TestRunner implements ResultPublisher{ 

这些是主类中用于线程管理的函数:

private void addResultExpectation(String process){
    resultMap.put(process, new JSONObject());
    expectedResultCount.addAndGet(1);
}    

public void publishResult(JSONObject result){
    String process = result.getString("process-name");
    String strResult = result.getString("result");
    resultMap.put(process, result);
    publishedResultCount.addAndGet(1);
    if(publishedResultCount.get() == expectedResultCount.get()){
        executor.shutdown();       
        System.out.println("shutting down executor for run " + runId);
    }
}  

这是界面

import org.json.JSONObject;
public interface ResultPublisher {
    void publishResult(JSONObject result);    
}

这是可运行的Runnable-TestRunner主类的内部类:

private class LoginPopUp implements Runnable{
        private ResultPublisher publisher;
        private String filePath;
        private String processName;
        private LoginPopUp(){            
        }

        public LoginPopUp(ResultPublisher publisher, String processName){
            this.publisher = publisher;
            this.processName = processName;
        }

        private void publish(JSONObject result){
            publisher.publishResult(result);
        }      

        public void run(){   
            JSONObject result = new JSONObject();
            result.put("path", filePath);
            try{
                Screen sd = new Screen();
                ScreenUtility s = new ScreenUtility(imagesDirectory);
                s.clickImage("LoginTitle.PNG", 10, 2500);
                s.typeImageWithOffset("UserName.PNG", userName, 30,0);
                s.typeImageWithOffset("Password.PNG",String.valueOf(password), 50,0);
                s.clickImage("AsicSignIn.PNG", 10, 250);
            }catch(Exception ex){
                result.put("result", ex.getMessage());
                result.put("process-name", processName);
                publish(result);
                Logger.getLogger(BCSRobot.class.getName()).log(Level.SEVERE, null, ex);
                return;                          
            }
            result.put("result", "logged in successfully");
            result.put("process-name", processName);
            publish(result);
            return;
        }
}