zoukankan      html  css  js  c++  java
  • selenium webdriver 右键另存为下载文件(结合robot and autoIt)

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

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

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

    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方法

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

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

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

    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方法单击保存按钮

    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类调用

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

    全部代码如下:

    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

  • 相关阅读:
    The Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/hong-fithing/p/7542245.html
Copyright © 2011-2022 走看看