当一个自动化测试被实如今一个浏览器以后,咱们会但愿咱们的测试可以覆盖到尽可能多的别的浏览器。经过跨平台的测试来保证咱们的程序在多个浏览器下都能正常工做。web
在安装了selenium以后,firefox webdriver和IE webdriver就已是ready to use的了,可是若是想要在Chrome下进行测试的话须要再安装Chrome webdriver。Chrome webdriver是由Chromium项目本身维护的,所以在实现上也和Firefox driver以及IE driver有一些不一样之处。这就致使了在将在Firefox上能够正常运行的测试代码运用到chrome时会产生一些兼容性的问题。ajax
1. WebDriverWait的可靠性chrome
上一篇博客提到过,当页面上有使用ajax异步加载的元素的时候,为了确保对元素进行操做的时候该元素已经处在一个可用的状态下了,咱们可使用WebDriverWait来使driver等待至目标元素知足给出的条件时才继续下面的操做。可是在Chrome中,这个方法彷佛不是老是适用。浏览器
2.一些奇怪的异常异步
总的来讲,测试代码在Chrome下的运行是很是快的,至少人眼就能够感受出来比Firefox下的运行速度要快一点,固然这是在不报异常的状况下。而实际状况是,在Firefox下能够正常运行的代码,在Chrome下却会出现问题,而且抛出一些奇怪的异常:测试
selenium.common.exceptions.WebDriverException: Message: u'unknown error: Element is not clickable at point selenium.common.exceptions.InvalidElementStateException: Message: u'invalid element state selenium.common.exceptions.ElementNotVisibleException: Message: u'element not visible
第一个异常的抛出通常会发生在radio button的点击事件上,可是通常异常抛出的同时,系统会告诉你当前的element不能够被点击,可是另外的某个元素能够接受这个点击事件。这时咱们能够查看页面上系统给出的备选元素是否也能够知足咱们的点击需求,若是能够,咱们能够简单的把radio button换成这个备选元素来回避这个异常。spa
另外,这三个异常都与Chrome的运行速度以及WebDriverWait的可靠性有必定关系。所以,咱们能够稍显“粗暴”的让webdriver休眠一段时间来slow down测试代码的执行速度,强制driver等待一个固定的时间来让元素加载完成。firefox
import time #some test code time.sleep(2) #continue test code
time.sleep(2)会使driver休眠两秒,而后再继续执行后面的测试代码code
3.不在当前视图范围内的元素的操做blog
当咱们使用Firefox webdriver来测试某个页面的时候,若是咱们选取了某个页面元素来对其进行操做,可是这个元素不在当前浏览器显示的视图范围内,Firefox webdriver的作法是自动的将视图调整到该元素显示的区域,而后对这个元素进行操做。也就是说driver本身完成了页面的scroll down or up的操做。
可是在Chrome webdriver中,若是待操做元素不在视图显示范围内,则会抛出Element is not clickable at point异常。或是若是设置了WebDriverWait而且它正常工做的话会抛出Timeout异常。
所以,在使用Chrome wbedriver的时候,咱们要更加当心,对于须要滚动页面才能显示在视图中的元素,咱们须要添加代码使页面滚动至元素显示的范围,而后再对该元素进行操做。使页面滚动的方法是:
driver.execute_script("window.scrollBy(0,200)","") #向下滚动200px driver.execute_script("window.scrollBy(0,document.body.scrollHeight)","") #向下滚动到页面底部