• 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或者如下设置:

      1. //Headless模式是系统的一种配置模式。在系统可能缺少显示设备、键盘或鼠标这些外设的情况下可以使用该模式。
      2. System.setProperty("java.awt.headless", "false");
    3. 若自己下载driverserver,需要注意driverserver存放位置,以及配置位置。

      1. String driverPath = "toPath/IEDriverServer.exe";
      2. //chrome浏览器位置设置
      3. System.setProperty("webdriver.chrome.driver", driverPath);
      4. //edge浏览器位置设置
      5. System.setProperty("webdriver.edge.driver", driverPath);
      6. //ie浏览器位置设置
      7. System.setProperty("webdriver.ie.driver", driverPath);

    4. 对WebElement的操作尽量使用Actions,而不是直接使用WebElement的方法。特别是WebElement的方法对IE上的非可交互dom是失效的。

      1. //通过下面操作代替WebElement.click()
      2. new Actions(driver).click(element).perform();
      3. //清除Input值除外,应通过下面操作代替WebElement.clear()
      4. WebElement.sendKeys(Keys.DELETE);
      5. //通过下面操作代替WebElement.sendKeys(Keys)
      6. new Actions(driver).sendKeys(element,Keys).perform();
      7. //并且通过Actions还可以模拟鼠标操作和键盘操作
      8. new Actions(driver).sendKeys(Keys.ARROW_DOWN).perform();
      9. new Actions(mDriver).contextClick(element).perform();

    5. 定焦dom,可以激活某个元素,可以使被被滚动条遮盖的内容显示出来,变为可操作。

      1. JavascriptExecutor executor = (JavascriptExecutor) mDriver;
      2. executor.executeScript("arguments[0].focus();", element);

    6. 滑动滚动条

      ((JavascriptExecutor) mDriver).executeScript("arguments[0].scrollIntoView();",element);

    7. 关闭通过window.open()打开的对话框:

      1. JavascriptExecutor executor = (JavascriptExecutor) mDriver;
      2. executor.executeScript("window.opener = null;window.open('','_self'); window.close(); ");

    8. 判断checkbox是否被选中:

      1. public boolean isChecked(By by){
      2. WebElement element = findElement(by);
      3. try{
      4. if(element != null && "input".equals(element.getTagName()) && "checkbox".equals(element.getAttribute("type"))){
      5. return "true".equals(element.getAttribute("checked"));
      6. }
      7. }catch (Exception ex){}
      8. return false;
      9. }

    9. Selenium 4以后,可以通过Edge的IE兼容性,通过IEDriverServer调用Edge浏览器,(当前不需要这么麻烦了,由于微软已计划使用Edge替换IE,可以通过系统设置来达到同样目的,在Internet选项-高级中取消“启用第三方浏览器扩展”。):

      1. InternetExplorerOptions options = new InternetExplorerOptions();
      2. //4.0.0之后支持IE附在Edge浏览器上。
      3. options.ignoreZoomSettings();
      4. options.attachToEdgeChrome();
      5. options.withEdgeExecutablePath("C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe");
      6. 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设置相同。
      1. // 浏览器存储用户配置文件的目录。
      2. String localappdata = System.getenv("LOCALAPPDATA");
      3. String userDataDir = String.format("--user-data-dir=%s/Google/Chrome/User Data",localappdata);
      4. options.addArguments(userDataDir);
      5. // 选择要与启动的第一个浏览器关联的配置文件目录。
      6. options.addArguments("--profile-directory=Default");

    5.使用IEDriverServer的注意事项

    1. IEDriverServer的版本要与Selenimu的版本一致;
    2. IEDriverServer的32位版本更稳定,不管Windows操作系统s是32位还是64位,尽量使用32位版本;
    3. 在使用前,需要在程序中定位IEDriverServer的位置;如下java配置:
      1. 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()函数无效,建议使用
      1. String js = "arguments[0].click();";
      2. JavascriptExecutor executor = (JavascriptExecutor) mDriver;
      3. 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修改,如下:

      1. String js String.format("arguments[0].value = '%s';",value);
      2. JavascriptExecutor executor = (JavascriptExecutor) mDriver;
      3. 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工作原理
  • 相关阅读:
    toB应用私有化交付发展历程、技术对比和选型
    UNITY—2D游戏制作入门!
    C语言指针进阶
    ARM 架构硬件新趋势:嵌入式领域的未来
    TD集群内存占用过高
    数学建模国赛/美赛常见赛题类型及建模方案(纯干货)
    云计算与大数据第7章 大数据概览练习题及答案
    无线信道划分
    艾美捷CpG-A DNA,人/小鼠的功能和应用
    C++ 并发编程实战 第八章 设计并发代码 二
  • 原文地址:https://blog.csdn.net/dhx20022889/article/details/126810019