selenium webdriver 右键另存为下载文件(结合robot and autoIt)

最近一直在研究selenium webdriver右键菜单,发现selenium webdriver 无法操作浏览器右键菜单,如图

 

如果我想右键另存为,根本操作不了。

也有在网上看到webdriver right click option的一些代码,拿来用发现不能用的。

1
2
3
4
5
Actions act = new Actions(driver);
  
WebElement link = driver.findElement(By.id("xpath"));
  
act.moveToElement(link).contextClick().sendKeys(Keys.ArrowsDown).build().perform();

使用Actions没办法拿到右键菜单。

后来在某论坛发帖,一个印度籍的专家给出solution, perfect!完美解决

http://forumsqa.com/question/how-to-click-the-option-of-the-menu-which-the-right-click-pop-up/

方案如下:

1.selenium 弹出右键菜单

2.robot选择相关菜单

3.调用autoIt实现windows gui另存操作

tips: 

目测autoIt没法操作web elements,比如我当前使用autoIt获取富文本框,却没法拿到相关的 classs,拿到的只能是浏览器的信息

废话不多说,test case 如下

1.打开autoIt的官网

2.click download 页面

3.选择autoIt下载图标,单击右键另存为

4.在弹出另存为窗口输入指定路径,单击保存

如果您有selenium基础,1~2都很easy。 调出右键菜单只需要action的contexClick方法

1
Action.contextClick(myElement).build().perform();

接下来就是选择右键菜单的另存为

使用robot,模拟键盘操作,使用方向键 ↓

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Robot robot = new Robot();
  
// This will bring the selection down one by one
  
robot.keyPress(KeyEvent.VK_DOWN);
  
Thread.sleep(1000);
  
robot.keyPress(KeyEvent.VK_DOWN);
  
Thread.sleep(1000);
  
robot.keyPress(KeyEvent.VK_DOWN);
  
Thread.sleep(1000);
  
robot.keyPress(KeyEvent.VK_DOWN);
  
Thread.sleep(1000);
  
// This is to release the down key, before this enter will not work
  
robot.keyRelease(KeyEvent.VK_DOWN);
  
Thread.sleep(1000);
  
robot.keyPress(KeyEvent.VK_ENTER);

接下来就该交给autoIt处理另存为窗口

autoIt使用方法:

依次定位保存按钮,使用ControlFocus方法,定位编辑框(文件名)title是“另存为”,class是Edit ,instance 是1 

然后使用ControlSetText方法输入保存路径,定位保存按钮,使用ControlClick方法单击保存按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ControlFocus("另存为", "","Edit1");ControlFocus("title","text",controlID) Edit1=Edit instance 1
; Wait 10 seconds for the Upload window to appear
 
  WinWait("[CLASS:#32770]","",10)
 
; Set input focus to the edit control of Upload window using the handle returned by WinWait
 
  ControlFocus("另存为","","Edit1")
 
  Sleep(2000)
 
; Set the File name text on the Edit field
 
  ControlSetText("另存为", "", "Edit1", "d:\autoit-v3-setup")
 
  Sleep(2000)
 
; Click on the Open button
 
  ControlClick("另存为", "","Button1");

然后使用autoIt转换为EXE格式的可执行文件

使用java的runTime类调用

1
Runtime.getRuntime().exec("E:\\test\\download.exe");

全部代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.packt.webdriver.chapter2;
 
  
 
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
 
  
 
import java.util.List;
import java.util.concurrent.TimeUnit;
 
import org.apache.commons.io.FileUtils;
  
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
//import org.openqa.selenium.WebDriver.Navigation;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
 
import com.thoughtworks.selenium.Selenium;
import com.thoughtworks.selenium.webdriven.WebDriverBackedSelenium;
  
 
  
 
public class AutoItDownload  {
     
 
 
    public static void main (String [] args) throws InterruptedException, AWTException
    {
          
      
        String URL="https://www.autoitscript.com";
        //avoid Chrome warnning message like "unsupported command-line flag --ignore-certificate-errors. "
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--test-type");
        
        System.setProperty("webdriver.chrome.driver", "E:\\chromedriver.exe"); 
        WebDriver driver = new ChromeDriver(options);
         //WebDriver driver = new FirefoxDriver();
        
        driver.get(URL);
      
 
        driver.manage().window().maximize();
        driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        WebElement editor=driver.findElement(By.xpath("//*[@id='menu-item-207']"));
        Actions actions=new Actions(driver);
        actions.moveToElement(editor).perform();
        //locate download link
        WebElement d=driver.findElement(By.xpath("//*[@id='menu-item-209']/a"));
        d.click();
        
        Thread.sleep(5000);
        //right click the download link
       
        
        //locate download link
     
        
        //right click the download link
        WebElement download=driver.findElement(By.xpath("//img[starts-with(@alt,'download autoit')]"));//*[@id="content-area"]/div/table/tbody/tr[1]/td[2]/p/a/img
        JavascriptExecutor js=(JavascriptExecutor)driver;
        // roll down and keep the element to the center of browser
        js.executeScript("arguments[0].scrollIntoView(true);", download);
        actions.moveToElement(download).contextClick().build().perform();
        Robot robot = new Robot();
         
     // This will bring the selection down one by one
       
     robot.keyPress(KeyEvent.VK_DOWN);
       
     Thread.sleep(1000);
       
     robot.keyPress(KeyEvent.VK_DOWN);
       
     Thread.sleep(1000);
       
     robot.keyPress(KeyEvent.VK_DOWN);
       
     Thread.sleep(1000);
       
     robot.keyPress(KeyEvent.VK_DOWN);
       
     Thread.sleep(1000);
       
    // robot.keyPress(KeyEvent.VK_DOWN);
       
     //Thread.sleep(1000);
       
     // This is to release the down key, before this enter will not work
       
     robot.keyRelease(KeyEvent.VK_DOWN);
       
     Thread.sleep(1000);
       
     robot.keyPress(KeyEvent.VK_ENTER);
        
         
        // this code block will snapshot the browser
        File scrShot=new File("d:\\1.png");
        File scrFile= ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        try {
             
            FileUtils.copyFile(scrFile, scrShot);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.println("Can't save screenshot");
            e.printStackTrace();
        }
        finally
        {
            
            System.out.println("screen shot finished");
        }
       // System.out.println(scrFile.getAbsolutePath());
         
        //call autoIt to save the file
        try {
            Runtime.getRuntime().exec("E:\\test\\download.exe");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         
        Thread.sleep(150000);
        driver.quit();
   
       
    }
     
}

效果图:

文章转自:http://www.cnblogs.com/tobecrazy/p/3969390.html

作者:Young

posted @   温一壶清酒  阅读(1882)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示