0


Selenium使用经验总结

1.Selenium工作原理

Selenium用来模拟人工操作浏览器,是业界很常用的Web测试工具,支持C#,java,python,js等主流语言。

我们常用的是Selenium WebDriver,其包括两部分,Selenium开发语言包和各种浏览器的DriverServer。我们通过编程操作Selenium,Selenium以json格式向DriverServer发送远程指令,DriverServer建立一个本地的微型http服务,启动相应浏览器,在浏览器中执行指令。

2.Selenium使用经验

Selenium对每个浏览器的支持都需要DriverServer,但是仅有IE浏览器的IEDriverSever.exe的版本仅需与Selenium开发包版本一致即可,而其他浏览器需要与本地浏览器的版本一致,甚至精确到小版本。若使用多台电脑做测试,且浏览器版本不一致,下载相应的DriderSever版本就是比较头痛的事。幸好,现在有webdrivermanager可供使用,会自动下载符合浏览器版本的driverserver。由于各种driverserver的大小不一样,所在的服务器不一样,在国内的访问情况各有不同。

本人是使用java做开发,所以,下面的内容以java距离分析问题。

3.通用注意事项

  1. 由于chromedriver.exe与msedgedriver.exe需要与本地浏览器版本一致,而不同电脑上的浏览器版本可能不一致,这时使用WebDriverManager来自动下载chromedriver是比较好的解决办法。 WebDriverManager.chromedriver().setup();
  2. 当使用java.awt.Robot来模拟键盘操作时,需要设置环境变量java.awt.headless=false或者如下设置://Headless模式是系统的一种配置模式。在系统可能缺少显示设备、键盘或鼠标这些外设的情况下可以使用该模式。System.setProperty("java.awt.headless", "false");
  3. 若自己下载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);
  4. 对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();
  5. 定焦dom,可以激活某个元素,可以使被被滚动条遮盖的内容显示出来,变为可操作。JavascriptExecutor executor = (JavascriptExecutor) mDriver;executor.executeScript("arguments[0].focus();", element);
  6. 滑动滚动条((JavascriptExecutor) mDriver).executeScript("arguments[0].scrollIntoView();",element);
  7. 关闭通过window.open()打开的对话框:JavascriptExecutor executor = (JavascriptExecutor) mDriver;executor.executeScript("window.opener = null;window.open('','_self'); window.close(); ");
  8. 判断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; }
  9. 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);
  10. 为了提高使用Selenium的效率,可以在同一台电脑上跑多个Selenium机器人。但是Windows一般仅支持服务器版操作系统的多用户同时操作,且需要按用户数收费。为了解决这个问题,我们可以通过在一个系统中开多个系统账户,保持系统用户在后台运行,通过切换用户来查看系统运行情况。

4.使用ChromeDriver的注意事项

  1. Chrome默认情况下,仅支持在第一个登录的账户中打开界面。切换到其他账户后,打开Chrome后并不能显示浏览器界面,也是在第一个账户下显示。为了解决此问题,需要为每个账户下的Chrome设置参数“--user-data-dir”默认值为“C:\Users\Administrator\AppData\Local\Google\Chrome\User Data”。只要为每个账户下的Chrome设置单独的用户数据地址,就可以在每个账户下打开浏览器。Edge设置相同。 // 浏览器存储用户配置文件的目录。 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");

5.使用IEDriverServer的注意事项

  1. IEDriverServer的版本要与Selenimu的版本一致;
  2. IEDriverServer的32位版本更稳定,不管Windows操作系统s是32位还是64位,尽量使用32位版本;
  3. 在使用前,需要在程序中定位IEDriverServer的位置;如下java配置: System.setProperty("webdriver.ie.driver", "D:\\BrowserDriver\\IEDriverServer.exe");
  4. Internet设置的安全设置,4个区域的启用保护模式设置全启用;
  5. Internet设置的高级设置中,取消“启用增强保护模式”;
  6. IE浏览器的运行速度相对于火狐和chrome等其它浏览器来说,速度要慢,所以更容易遇到“NoSuchElementFound”的异常,在对元素定位时尽量使用CSS Selector和xpath,在自动化测试中尽量使用火狐或谷歌做为默认的主测浏览器;
  7. “NoSuchElementFound”异常的解决办法之一是:在每次定位之前至少等待2秒,并且通过WebDriverWait.until进行查找元素,且等待时间不低于20秒。其实这两个等待时间是可以根据机器情况进行调整的,需要具体情况具体分析。
  8. “NoSuchElementFound”异常的解决办法之二是:当前iedriverserver.exe已经对xpath有比较好的支持,但是可以通过比较详细和精确的xpath的描述来查找元素。
  9. html元素在IE浏览器中核其他浏览器中的属性可能有些差异,也可能大小写不一致,所以若是需要支持多种浏览器,或者通过chrome浏览器调试,但应用时使用IE 浏览器时,若遇到找不到元素的异常,xpath或cssSelector定位在多种浏览器之间是否一致。
  10. WebElement.click()函数无效,建议使用 String js = "arguments[0].click();"; JavascriptExecutor executor = (JavascriptExecutor) mDriver; return executor.executeScript(js,element);或者new Actions(driver).click().perform();
  11. 有些电脑,在初次启动IE时,会有一个防火墙的弹窗提示,选择允许,再次运行脚本即可;
  12. 若IE已经合并进Edge浏览器,则在Edge的设置-默认浏览器-Internet Explorer 兼容性;禁用“让Internet Explorer在Edge中打开网页”,且不允许在 Internet Explorer 模式下重新加载网站。在Internet选项-高级中取消“启用第三方浏览器扩展”。
  13. 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%
  14. 对于通过js控制显示的Input控件,通过element.sendKey(value)无法修改,可以使用js修改,如下:String js String.format("arguments[0].value = '%s';",value);JavascriptExecutor executor = (JavascriptExecutor) mDriver;executor.executeScript(js,element);
  15. Windows11下已完全禁用IE浏览器,当双击IE浏览器图标时,会自动跳转打开Edge。通过取消“启用第三方浏览器扩展”也不能解决。只能通过vb脚本来解决。创建vbs文件,内容如下: CreateObject("InternetExplorer.Application").Enable=true保存后,双击即可打开IE浏览器。

参考:

  1. 《解决Selenium 调用IEDriverServer打开IE浏览器》
  2. 《使用Selenium启动IE浏览器》
  3. 《Selenium工作原理》

本文转载自: https://blog.csdn.net/dhx20022889/article/details/126810019
版权归原作者 WalsonTung 所有, 如有侵权,请联系我们删除。

“Selenium使用经验总结”的评论:

还没有评论