使用 Selenium 在 IE 中下载文件
Download a file in IE using Selenium
好的,所以我正在尝试使用 Selenium 导出文件。我的浏览器是IE。当我单击导出按钮时,会出现一个原生 windows 对话框。
弹出窗口的图像
我必须单击“保存”按钮。为此,我尝试使用 AutoIT
但它不起作用。
exportbutton.click();
Thread.sleep(2000);
driver.switchTo().activeElement();
AutoItX x = new AutoItX();
x.winActivate("window name");
x.winWaitActive("window name");
x.controlClick("window name", "", "[CLASS:Button; INSTANCE:2]");
这没有用。所以我决定使用 Robot class 并执行键盘点击 Atl + S
,因为这也将使浏览器能够保存文件。那也不管用。
try
{
Robot robot = new Robot();
robot.setAutoDelay(250);
robot.keyPress(KeyEvent.VK_ALT);
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_S);
}
catch (AWTException e)
{
e.printStackTrace();
}
我想网络驱动程序有问题,因为我尝试在 exportbutton.click()
之后打印一行,但也没有打印出来。
我是新手,所以我不明白这个问题。请帮帮我。
抱歉,我写了如何上传文件的方法。如果您想下载 - 使用相同的方法,但使用另一个按钮:代替按钮 Cntrl + V,您可以使用按钮 Tab 找到 Save/Save 的控件,然后按 Enter。在它之前,您可以粘贴带有文件路径的字符串(您要上传文件的目录)。
因此,问题是当您调用 click() 函数时,光标有时会卡住。因此,作为解决方案,我使用 Robot class 移动光标并单击导出按钮,然后我使用 Robot class 按下 Alt+S,这是在 IE 中保存文件的键盘快捷键.
点击我使用的按钮
try
{
Robot robot = new Robot();
Thread.sleep(2000);
robot.mouseMove(coordinates.getX()+100,coordinates.getY()-400);
Thread.sleep(2000);
robot.mousePress( InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
}
catch (AWTException e)
{
e.printStackTrace();
}
为了获取上述代码片段中的坐标,我使用了以下行
Point coordinates = driver.findElement(By.id("id")).getLocation();
System.out.println("Co-ordinates"+coordinates);
然后按 Alt+S 我使用了以下代码
try
{
Robot robot = new Robot();
robot.setAutoDelay(250);
robot.keyPress(KeyEvent.VK_ALT);
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_S);
}
catch (AWTException e)
{
e.printStackTrace();
}
我遇到了同样的问题。我开始意识到
button.click()
在这种情况下效果不佳(使用 IE 驱动程序)。所以我没有点击按钮,而是尝试了这个:
robot = new Robot();
button.sendKeys("""");
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
这只是将焦点放在按钮上,然后 'presses' 通过按回车键。
Auto IT 不需要处理此问题。只需使用下面的代码,它就可以正常工作。
如果我们在元素上给出 element.click,控制将停在那里,因此我们使用 element.sendkeys("") 和 robot.keyPress(KeyEvent.VK_ENTER);
完整代码如下:
Robot robot = new Robot();
//将焦点放在元素上..不要使用点击,因为它会拖慢驱动程序
element.sendKeys("");
//simulate pressing enter
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
//wait for the modal dialog to open
Thread.sleep(2000);
//press s key to save
robot.keyPress(KeyEvent.VK_ALT);
robot.keyPress(KeyEvent.VK_N);
robot.keyRelease(KeyEvent.VK_N);
robot.keyRelease(KeyEvent.VK_ALT);
Thread.sleep(2000);
//press enter to save the file with default name and in default location
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
Thread.sleep(2000);
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_DOWN);
Thread.sleep(2000);
robot.keyPress(KeyEvent.VK_DOWN);
robot.keyRelease(KeyEvent.VK_DOWN);
Thread.sleep(2000);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
Thread.sleep(2000);
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
我使用了 AutoIt,它在 windows 10 中有效。请参考以下 AutoIt 脚本:
Sleep(9000);
Local $hIE = WinGetHandle("[Class:IEFrame]");
Local $hCtrl = ControlGetHandle($hIE, "", "[ClassNN:DirectUIHWND1]");
If WinExists($hIE,"") Then
WinActivate($hIE,"");
ControlSend($hIE ,"",$hCtrl,"{F6}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{TAB}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{ENTER}");
EndIf
Sleep(5000);
If WinExists($hIE,"") Then
WinActivate($hIE,"");
ControlSend($hIE ,"",$hCtrl,"{F6}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{TAB}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{TAB}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{TAB}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{ENTER}");
EndIf
Sleep(5000);
它单击保存按钮并关闭下一个警报。
请相应调整Sleep()
。
这是 Dave Haefner 的黑客攻击。如果您不关心文件是否下载,而只想确认文件可以下载,则可以使用 HTTP 请求。您不会下载文件,而是会收到文件的 header 信息,其中包含内容类型和长度等内容。使用此信息,您可以确认该文件是您期望的。
String link = driver.findElement(By.cssSelector("download-link-element")).getAttribute("href");
HttpClient httpClient = HttpClientBuilder.create().build();
HttpHead request = new HttpHead(link);
HttpResponse response = httpClient.execute(request);
String contentType = response.getFirstHeader("Content-Type").getValue();
int contentLength = Integer.parseInt(response.getFirstHeader("Content-Length").getValue());
assertThat(contentType, is("application/octet-stream"));
assertThat(contentLength, is(not(0)));
好的,所以我正在尝试使用 Selenium 导出文件。我的浏览器是IE。当我单击导出按钮时,会出现一个原生 windows 对话框。
弹出窗口的图像
我必须单击“保存”按钮。为此,我尝试使用 AutoIT
但它不起作用。
exportbutton.click();
Thread.sleep(2000);
driver.switchTo().activeElement();
AutoItX x = new AutoItX();
x.winActivate("window name");
x.winWaitActive("window name");
x.controlClick("window name", "", "[CLASS:Button; INSTANCE:2]");
这没有用。所以我决定使用 Robot class 并执行键盘点击 Atl + S
,因为这也将使浏览器能够保存文件。那也不管用。
try
{
Robot robot = new Robot();
robot.setAutoDelay(250);
robot.keyPress(KeyEvent.VK_ALT);
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_S);
}
catch (AWTException e)
{
e.printStackTrace();
}
我想网络驱动程序有问题,因为我尝试在 exportbutton.click()
之后打印一行,但也没有打印出来。
我是新手,所以我不明白这个问题。请帮帮我。
抱歉,我写了如何上传文件的方法。如果您想下载 - 使用相同的方法,但使用另一个按钮:代替按钮 Cntrl + V,您可以使用按钮 Tab 找到 Save/Save 的控件,然后按 Enter。在它之前,您可以粘贴带有文件路径的字符串(您要上传文件的目录)。
因此,问题是当您调用 click() 函数时,光标有时会卡住。因此,作为解决方案,我使用 Robot class 移动光标并单击导出按钮,然后我使用 Robot class 按下 Alt+S,这是在 IE 中保存文件的键盘快捷键.
点击我使用的按钮
try
{
Robot robot = new Robot();
Thread.sleep(2000);
robot.mouseMove(coordinates.getX()+100,coordinates.getY()-400);
Thread.sleep(2000);
robot.mousePress( InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
}
catch (AWTException e)
{
e.printStackTrace();
}
为了获取上述代码片段中的坐标,我使用了以下行
Point coordinates = driver.findElement(By.id("id")).getLocation();
System.out.println("Co-ordinates"+coordinates);
然后按 Alt+S 我使用了以下代码
try
{
Robot robot = new Robot();
robot.setAutoDelay(250);
robot.keyPress(KeyEvent.VK_ALT);
Thread.sleep(1000);
robot.keyPress(KeyEvent.VK_S);
robot.keyRelease(KeyEvent.VK_ALT);
robot.keyRelease(KeyEvent.VK_S);
}
catch (AWTException e)
{
e.printStackTrace();
}
我遇到了同样的问题。我开始意识到
button.click()
在这种情况下效果不佳(使用 IE 驱动程序)。所以我没有点击按钮,而是尝试了这个:
robot = new Robot();
button.sendKeys("""");
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);
这只是将焦点放在按钮上,然后 'presses' 通过按回车键。
Auto IT 不需要处理此问题。只需使用下面的代码,它就可以正常工作。 如果我们在元素上给出 element.click,控制将停在那里,因此我们使用 element.sendkeys("") 和 robot.keyPress(KeyEvent.VK_ENTER);
完整代码如下:
Robot robot = new Robot();
//将焦点放在元素上..不要使用点击,因为它会拖慢驱动程序
element.sendKeys(""); //simulate pressing enter robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); //wait for the modal dialog to open Thread.sleep(2000); //press s key to save robot.keyPress(KeyEvent.VK_ALT); robot.keyPress(KeyEvent.VK_N); robot.keyRelease(KeyEvent.VK_N); robot.keyRelease(KeyEvent.VK_ALT); Thread.sleep(2000); //press enter to save the file with default name and in default location robot.keyPress(KeyEvent.VK_TAB); robot.keyRelease(KeyEvent.VK_TAB); Thread.sleep(2000); robot.keyPress(KeyEvent.VK_DOWN); robot.keyRelease(KeyEvent.VK_DOWN); Thread.sleep(2000); robot.keyPress(KeyEvent.VK_DOWN); robot.keyRelease(KeyEvent.VK_DOWN); Thread.sleep(2000); robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER); Thread.sleep(2000); robot.keyPress(KeyEvent.VK_ENTER); robot.keyRelease(KeyEvent.VK_ENTER);
我使用了 AutoIt,它在 windows 10 中有效。请参考以下 AutoIt 脚本:
Sleep(9000);
Local $hIE = WinGetHandle("[Class:IEFrame]");
Local $hCtrl = ControlGetHandle($hIE, "", "[ClassNN:DirectUIHWND1]");
If WinExists($hIE,"") Then
WinActivate($hIE,"");
ControlSend($hIE ,"",$hCtrl,"{F6}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{TAB}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{ENTER}");
EndIf
Sleep(5000);
If WinExists($hIE,"") Then
WinActivate($hIE,"");
ControlSend($hIE ,"",$hCtrl,"{F6}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{TAB}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{TAB}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{TAB}");
Sleep(1500);
ControlSend($hIE ,"",$hCtrl,"{ENTER}");
EndIf
Sleep(5000);
它单击保存按钮并关闭下一个警报。
请相应调整Sleep()
。
这是 Dave Haefner 的黑客攻击。如果您不关心文件是否下载,而只想确认文件可以下载,则可以使用 HTTP 请求。您不会下载文件,而是会收到文件的 header 信息,其中包含内容类型和长度等内容。使用此信息,您可以确认该文件是您期望的。
String link = driver.findElement(By.cssSelector("download-link-element")).getAttribute("href");
HttpClient httpClient = HttpClientBuilder.create().build();
HttpHead request = new HttpHead(link);
HttpResponse response = httpClient.execute(request);
String contentType = response.getFirstHeader("Content-Type").getValue();
int contentLength = Integer.parseInt(response.getFirstHeader("Content-Length").getValue());
assertThat(contentType, is("application/octet-stream"));
assertThat(contentLength, is(not(0)));