有谁知道我们如何在selenium Webdriver中处理浏览器的Authenticate警告框?
我使用以下代码,但无效。
driver.switchTo().alert().authenticateUsing(new UserAndPassword("uname", "Password"));
以下是我要填写的内容的屏幕截图:
有谁知道如何输入这些凭证?
答案 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)
您可以通过两种方式处理此问题:
您可以直接通过以下网址传递用户名和密码:
driver..get("https://MyUserName:password@staging.www.abc.com")
您还可以使用AutoIT Tool处理任何类型的窗口弹出窗口。
您可以在其中编写脚本,也可以使用Au3Recorder。它不适用于SciTE的新版本,但您可以分别从旧版本download获取它。解压缩并复制:
autoit-v3.3.14.0.zip\install\Extras\Au3Record
到
[@Install Dir of AutoIt in Program files]\Extras\Au3Record
现在您可以通过单击 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;
}
}