场景:
测试过程中需要触发选择本地文件进行上传操作。
问题:
以前用 Selenium2,直接使用 AotuIT 可以直接上传,现在改用 Selenium3,在点击选择按钮,弹出选择窗体后,代码停止执行了,除非将选择窗体关闭,代码才会继续执行。
可能原因:
在弹出系统选择窗体后,线程被挂起了,不会再继续执行,这只是我觉得。
解决办法:
单独开启线程执行上传文件操作,让主线程和上传文件线程同时进行,如图:
环境:
Firefox:49.0.1
Selenium:3.8.1
示例代码:
火狐浏览器设置:
火狐右键 - 属性,在目标中,追加: -no-romote -profilemanager
创建一个配置:
测试类示例如下:
@Test
public void Test() throws InterruptedException{
//声明浏览器driver设置后打开,前往目标地址
WebDriver driver;
System.setProperty("webdriver.gecko.driver", "file/geckodriver.exe");
System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
ProfilesIni pi = new ProfilesIni();
//获取firefox浏览器的用户配置方案
FirefoxProfile profile = pi.getProfile("selenium");
FirefoxOptions options = new FirefoxOptions();
options.setProfile(profile);
driver = new FirefoxDriver(options);
driver.get("https://www.XX.com/");
Thread.sleep(2000);
//声明点击上传按钮
WebElement upload_btn = driver.findElement(By.id("fileImg"));
//声明上传线程类,并启动
MyTestThread myth= new MyTestThread();
myth.start();
//点击上传按钮
upload_btn.click();
//此处需要等待大于3秒的时间,或者有足够操作步骤,来等待完成上传线程中的一些列操作
Thread.sleep(4000);
}
}
上传线程类,示例如下:
public class MyTestThread extends Thread{
File file=new File("E:\\workspace\\selenium\\file\\Chrysanthemum.jpg");
public void run (){
try {
//使该线程强制等待3秒,目的是等待Windows窗口弹出再执行autoit脚本
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String cmd="\"C:\\upload.exe\" \"firefox\" \"C:\\1.jpg\"";
try{
Process p= Runtime.getRuntime().exec(cmd);
p.waitFor();
} catch(Exception e) {
e.printStackTrace();
}
}