WebDriver使用中的一些问题

来源:互联网 发布:产品数据管理软件 编辑:程序博客网 时间:2024/05/20 02:55

本小节内容:WebDriver使用中的一些问题

  1. WebDriver基本使用方式
    • 获取元素方式
      • 关于xpath
    • 浏览器兼容性
  2. 驱动程序重复加载

1: WebDriver基本使用

这个网上很多,我也就不重复了,给大家提供几个比较好链接:
对于我们只想尽快helloWord的,可以先看这个【我就是靠着三个小例子开始做的】
chrome驱动(各种版本的)
IE驱动(各种版本的)
Firefox驱动
Selenium Webdriver 中文社区【想深入学习的可以看看这个,资源好多】

1.1 使用WebDriver获取页面元素的方式

首先我得承认一点:期初对WebDriver的想法是:这东西很强大,只要告诉它用户名密码,它就可以在页面找到用户名密码的输入框,输入之后自动登录。

后来一细想,这个想法太不靠谱,即使它可以通过“模糊”判断出用户名密码的地方,可它是个自动化测试工具,不只是用来登录的,它要实现的功能还很多,页面这么复杂,它哪能这么智能的根据你的意图来正确的点击页面上的控件呢。那它是怎么实现的呢,答案就在那三个例子里,例子里 先找到百度输入框

WebElement element = driver.findElement(By.id("kw"));

(F12一下就知道,输入框的id就是“kw”),这并不是一种“固定写法”,如下图:
百度输入框

至此,我对自己要做的“自动登录系统小工具”【1】的使用方式有新的改变:用户是需要自己根据页面配置每一步操作步骤细节的。需要细化到控件的“定位方式”,这就是本小节的内容,还是老规矩,先分享个好链接:Selenium Webdriver元素定位的八种常用方式

对于这个链接就说一点:xpath是个好东西(即使没用过,应该也像我一样听说过,因为这是一种标准的xml定位语言),虽然该教程中说 xpath方式很慢,cssSelector方式是一种更快的方式。但cssSelector的应用范围不广,也不是什么标准。所以我建议好好看看xpath

1.2 浏览器兼容性问题

  1. WebDriver版本在不断更新、浏览器的版本也在更新。他们之间存在兼容性问题。前者更新的较慢一拍。
  2. webDriver之前支持原生火狐,即只有火狐是不需要驱动的(其他浏览器的需要驱动),但需要火狐的可执行文件路径(感觉好像还不如只需要驱动来的方便)。webDriver3之后就和其他浏览器一样了,也需要驱动,见:
    Selenium3启动Firefox Version 48.x浏览器(ff 原生 geckodriver 诞生)
    Selenium WebDriver selenium3 的个浏览器启动方法 (JAVA)
    简单来说就是需要加一句:
System.setProperty("webdriver.gecko.driver", "geckodriver.exe的路径");
  1. 如果你的火狐版本是50以上的话,可能即使是最新的webDriver3也不兼容(我的是火狐50.1,没试验成功,不过还好,客户不要求用火狐)
  2. IE比较麻烦,需要给浏览器设置一下,见:
    WebDriver使用IE浏览器

总结: 给我的感觉:chrome这个似乎原本应该和webDriver兼容性最不好的 反而表现最好(谷歌大法好啊~)

2. 驱动重复加载问题

现象: 多次使用WebDriver后,任务管理器中会出现:
驱动重复加载

每次执行异常WebDriver就会产生一个浏览器驱动进程,这一堆的浏览器驱动,会引起什么问题呢
1. 该驱动会占用着你的程序文件,让你删不掉程序(我的小工具用了maven自动打包成jar,每次重新打包都需要先删除就旧的target文件,我就是打包报错时发现的 这个问题)
2. 占用资源(这个想想也知道了)

但对于这个问题,我有几个疑问,没弄明白:
1. 期初我以为是因为每次启动程序,执行了:

System.setProperty("webdriver.ie.driver","E:\\IEDriverServer.exe");

导致的。后来发现,如果执行了一次程序,之后即使不写上面这句话,程序依然可以正确执行,而且任务管理器里面 照样多一个IEDriverServer.exe
2. 后来我拿着自己的程序在其他电脑上测试的时候,发现第一条并不成立,在这个电脑上:每次必须执行上面那句话,否则就报错,即便任务管理器里面已经有一堆IEDriverServer.exe了。所以我的程序逻辑改为:一开始先执行这句话,最后执行一句杀掉进程IEDriverServer.exe的逻辑。在上面我提供的一个链接里,大家应该发现一个WebDriver API提供了一个方便的杀进程工具

WindowsUtils.killByName("IEDriverServer.exe"); //杀掉IE驱动进程

【1】请见我的另一篇博客 一个javaWeb程序员做一个桌面小应用的总结