Selenium用来模拟人工操作浏览器,是业界很常用的Web测试工具,支持C#,java,python,js等主流语言。
我们常用的是Selenium WebDriver,其包括两部分,Selenium开发语言包和各种浏览器的DriverServer。我们通过编程操作Selenium,Selenium以json格式向DriverServer发送远程指令,DriverServer建立一个本地的微型http服务,启动相应浏览器,在浏览器中执行指令。
Selenium对每个浏览器的支持都需要DriverServer,但是仅有IE浏览器的IEDriverSever.exe的版本仅需与Selenium开发包版本一致即可,而其他浏览器需要与本地浏览器的版本一致,甚至精确到小版本。若使用多台电脑做测试,且浏览器版本不一致,下载相应的DriderSever版本就是比较头痛的事。幸好,现在有webdrivermanager可供使用,会自动下载符合浏览器版本的driverserver。由于各种driverserver的大小不一样,所在的服务器不一样,在国内的访问情况各有不同。
本人是使用java做开发,所以,下面的内容以java距离分析问题。
WebDriverManager.chromedriver().setup();
当使用java.awt.Robot来模拟键盘操作时,需要设置环境变量java.awt.headless=false或者如下设置:
- //Headless模式是系统的一种配置模式。在系统可能缺少显示设备、键盘或鼠标这些外设的情况下可以使用该模式。
- System.setProperty("java.awt.headless", "false");
若自己下载driverserver,需要注意driverserver存放位置,以及配置位置。
- String driverPath = "toPath/IEDriverServer.exe";
- //chrome浏览器位置设置
- System.setProperty("webdriver.chrome.driver", driverPath);
- //edge浏览器位置设置
- System.setProperty("webdriver.edge.driver", driverPath);
- //ie浏览器位置设置
- System.setProperty("webdriver.ie.driver", driverPath);
对WebElement的操作尽量使用Actions,而不是直接使用WebElement的方法。特别是WebElement的方法对IE上的非可交互dom是失效的。
- //通过下面操作代替WebElement.click()
- new Actions(driver).click(element).perform();
- //清除Input值除外,应通过下面操作代替WebElement.clear()
- WebElement.sendKeys(Keys.DELETE);
- //通过下面操作代替WebElement.sendKeys(Keys)
- new Actions(driver).sendKeys(element,Keys).perform();
- //并且通过Actions还可以模拟鼠标操作和键盘操作
- new Actions(driver).sendKeys(Keys.ARROW_DOWN).perform();
- new Actions(mDriver).contextClick(element).perform();
定焦dom,可以激活某个元素,可以使被被滚动条遮盖的内容显示出来,变为可操作。
- JavascriptExecutor executor = (JavascriptExecutor) mDriver;
- executor.executeScript("arguments[0].focus();", element);
滑动滚动条
((JavascriptExecutor) mDriver).executeScript("arguments[0].scrollIntoView();",element);
关闭通过window.open()打开的对话框:
- JavascriptExecutor executor = (JavascriptExecutor) mDriver;
- executor.executeScript("window.opener = null;window.open('','_self'); window.close(); ");
判断checkbox是否被选中:
- public boolean isChecked(By by){
- WebElement element = findElement(by);
- try{
- if(element != null && "input".equals(element.getTagName()) && "checkbox".equals(element.getAttribute("type"))){
- return "true".equals(element.getAttribute("checked"));
- }
- }catch (Exception ex){}
- return false;
- }
的
Selenium 4以后,可以通过Edge的IE兼容性,通过IEDriverServer调用Edge浏览器,(当前不需要这么麻烦了,由于微软已计划使用Edge替换IE,可以通过系统设置来达到同样目的,在Internet选项-高级中取消“启用第三方浏览器扩展”。):
- InternetExplorerOptions options = new InternetExplorerOptions();
- //4.0.0之后支持IE附在Edge浏览器上。
- options.ignoreZoomSettings();
- options.attachToEdgeChrome();
- options.withEdgeExecutablePath("C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe");
- mDriver = new InternetExplorerDriver(options);
为了提高使用Selenium的效率,可以在同一台电脑上跑多个Selenium机器人。但是Windows一般仅支持服务器版操作系统的多用户同时操作,且需要按用户数收费。为了解决这个问题,我们可以通过在一个系统中开多个系统账户,保持系统用户在后台运行,通过切换用户来查看系统运行情况。
- // 浏览器存储用户配置文件的目录。
- String localappdata = System.getenv("LOCALAPPDATA");
- String userDataDir = String.format("--user-data-dir=%s/Google/Chrome/User Data",localappdata);
- options.addArguments(userDataDir);
- // 选择要与启动的第一个浏览器关联的配置文件目录。
- options.addArguments("--profile-directory=Default");
-
- System.setProperty("webdriver.ie.driver", "D:\\BrowserDriver\\IEDriverServer.exe");
- String js = "arguments[0].click();";
- JavascriptExecutor executor = (JavascriptExecutor) mDriver;
- return executor.executeScript(js,element);
或者new Actions(driver).click().perform();
E浏览器的缩放比率(zoom level)要是默认的100%,否则要报下面类似的错误:
Exception in thread "main" org.openqa.selenium.SessionNotCreatedException: Unexpected error launching Internet Explorer. Browser zoom level was set to 130%. It should be set to 100%
对于通过js控制显示的Input控件,通过element.sendKey(value)无法修改,可以使用js修改,如下:
- String js String.format("arguments[0].value = '%s';",value);
- JavascriptExecutor executor = (JavascriptExecutor) mDriver;
- executor.executeScript(js,element);
CreateObject("InternetExplorer.Application").Enable=true
保存后,双击即可打开IE浏览器。
参考: