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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架