1. 背景
Selenium自动化不支持多选和文件另存为
2. 解决方案
Action和Robot实现文件另存为和多选
import org.openqa.selenium.interactions.Actions;import java.awt.Robot;
3. CTRL+A多选
Actions ac = new Actions(driver);ac.keyDown(Keys.CONTROL);// ac.keyDown(Keys.SHIFT) 控件连续且较多时使用ac.click(WebElement1);ac.click(WebElement2);ac.keyUp(Keys.CONTROL);// ac.keyUp(Keys.SHIFT)ac.perform();
此方案在ie浏览器下无法动作(Selenium3.9 + IEDriver3.4.0 + ie11)。
Robot robot = new Robot();robot.keyPress(KeyEvent.VK_CONTROL);// robot.keyPress(KeyEvent.VK_SHIFT);WebElement1.click();WebElement2.click();--------------------------------------click的替代方案:robot.mouseMove(WebElement1.getLocation().x, WebElement1.getLocation().y);robot.mousePress(InputEvent.BUTTON1_MASK);robot.mouseRelease(InputEvent.BUTTON1_MASK);--------------------------------------robot.keyRelease(KeyEvent.VK_CONTROL);// robot.keyRelease(KeyEvent.VK_SHIFT);
此方案在chrome浏览器下无法动作(Selenium3.9 + ChromeDriver87 + Chrome87)。
4. 另存为
public void type(String characters) {StringSelection stringSelection = new StringSelection(characters);Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_V);robot.keyRelease(KeyEvent.VK_V);robot.keyRelease(KeyEvent.VK_CONTROL);}public String download(WebDriver driver, String Name) {try {File file = new File(Name);if (file.exists()) {// 删除同名文件file.delete();}robot = new Robot();robot.setAutoDelay(1000);if (System.getProperty("browser").equals("ie")) {// 获取下载框交点,弹出另存为robot.keyPress(KeyEvent.VK_ALT);robot.keyPress(KeyEvent.VK_N);robot.keyRelease(KeyEvent.VK_N);robot.keyRelease(KeyEvent.VK_ALT);robot.delay(1000);robot.keyPress(KeyEvent.VK_TAB);robot.keyRelease(KeyEvent.VK_TAB);robot.delay(1000);robot.keyPress(KeyEvent.VK_DOWN);robot.keyRelease(KeyEvent.VK_DOWN);robot.delay(1000);robot.keyPress(KeyEvent.VK_DOWN);robot.keyRelease(KeyEvent.VK_DOWN);robot.delay(1000);robot.keyPress(KeyEvent.VK_ENTER);robot.keyRelease(KeyEvent.VK_ENTER);}else if(System.getProperty("browser").equals("edge")){// 获取下载框交点,弹出另存为robot.keyPress(KeyEvent.VK_F6);robot.keyRelease(KeyEvent.VK_F6);Thread.sleep(1000);robot.keyPress(KeyEvent.VK_TAB);robot.keyRelease(KeyEvent.VK_TAB);robot.keyPress(KeyEvent.VK_TAB);robot.keyRelease(KeyEvent.VK_TAB);robot.keyPress(KeyEvent.VK_TAB);robot.keyRelease(KeyEvent.VK_TAB);robot.keyPress(KeyEvent.VK_ENTER);robot.keyRelease(KeyEvent.VK_ENTER);}robot.delay(2000);type(Name);robot.delay(1000);robot.keyPress(KeyEvent.VK_ALT);robot.keyPress(KeyEvent.VK_S);robot.keyRelease(KeyEvent.VK_S);robot.keyRelease(KeyEvent.VK_ALT);robot.delay(1000);robot.keyPress(KeyEvent.VK_ALT);robot.keyPress(KeyEvent.VK_Q);robot.keyRelease(KeyEvent.VK_Q);robot.keyRelease(KeyEvent.VK_ALT);} catch (AWTException e) {;} catch (Exception e) {;}}