使用Selenium在IE中下载文件

问题描述 投票:4回答:6

好的,所以我尝试使用Selenium导出文件。我的浏览器是IE。当我点击导出按钮时,会出现一个本机窗口对话框。

弹出enter image description here的图像

我必须单击“保存”按钮。为此,我尝试使用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类并执行键盘点击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()之后打印一条线并且它也没有打印出来。

我是新人,所以我无法理解这个问题。请帮帮我。

java selenium internet-explorer autoit
6个回答
3
投票

所以,问题是当你调用click()函数时,光标有时会卡住。因此,作为一个解决方案,我使用Robot类移动光标并单击导出按钮,然后我使用Robot类按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();
}

1
投票

我有同样的问题。我开始意识到这一点

button.click()

在这种情况下(使用IE驱动程序)不能很好地工作。所以不是点击按钮我尝试了这个:

robot = new Robot();
button.sendKeys("""");
robot.keyPress(KeyEvent.VK_ENTER);
robot.keyRelease(KeyEvent.VK_ENTER);

这只是关注按钮并按下输入“按下”按钮。


0
投票

对不起,我写了如何上传文件的方法。如果你想下载 - 使用相同的方法,但使用另一个按钮:而不是按钮Cntrl + V你可以使用按钮Tab找到保存/另存为的控制,然后按Enter键。在它之前,您可以使用文件路径(要上载文件的目录)粘贴String。


0
投票

自动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);

0
投票

我使用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);

它单击保存按钮并关闭下一个警报。

enter image description here

请相应调整Sleep()


0
投票

这是Dave Haefner的黑客攻击。如果您不关心是否下载了文件,并且只想确认可以下载文件,则可以使用HTTP请求。您不会下载文件,而是会收到包含内容类型和长度等内容的文件的标题信息。有了这些信息,您可以确认您期望的文件。

    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)));
© www.soinside.com 2019 - 2024. All rights reserved.