二次封装

二次封装

1、二次封装之前,先来复习下selenium的三种等待方式。

  1、sleep(强制等待,进程休眠)

    1、作用于局部。浪费时间。看情况使用。

  2、implicitly_wait(30)(隐式等待)

    1、作用于全局。

    2、需等待页面完全加载完成,之后才会去查找元素。(游览器左上角转圈结束表示加载完成)

    3、如果页面元素加载已完成。但是部分js之类的加载失败(此时页面转圈是一直在转的),会继续加载,直到30s。

    4、且有切换页面的时候。需加强制等待,不然会报错。

    &一般自动化脚本不会用隐式等待

  3、WebDriverWait(显示等待)    

    WebDriverWait(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

    1、在a秒内,每间隔b秒内查询一次。查询到了就返回,没查询到就等待下一次查询,超过a秒还未查询到就抛出timeout异常。

    2、作用于局部

    3、格式如下:

      1、element = WebDriverWait(driver,10).until(lambda x: x.find_element_by_id("kw"))

      element.send_keys("xxx")

      注:对照上面,第一个参数self忽略,第二参数传driver不用说,第三个参数timeout传10,可以自行修改。第四个参数poll_frequency不修改默认0.5,可以自行修改。

      第五个ignored_exceptions默认忽略异常。(这里的x传的是driver。lambda学过python基础应该都知道)

      

  4、定位方法优化:

    我们常用的定位方法有find_element_by_id、by_name、by、xpath等等。但是这些我们可以统一用By方法来实现:

    from selenium.webdriver.common.by import By   ---首先导入by方法

    比如我们之前id定位就可以改成driver.find_element(By.ID,"值"),然后我们可以去看看By这个方法的源码。

    二次封装

    其实我们写的导入By,写了个By.ID实际上等于引入了一个“id”而已。所以我们可以再优化一下,比如我们之前id定位就可以改成driver.find_element(“id”,"值"),其余几种定位也是如此。

  

  5、现在我们就可以来封装一个比如元素定位的方法了。

    1、新建一个类。Base,继承object类。

    2、定义一个方法。比如findElement。

    二次封装

    注:loctor只是一个参数,不具备别的意义,你可以修改命名,self.t就是 poll_frequency。*号代表参数分开传递,学过python基础的应该都知道。

    3、同时。self.driver,self.timeout,self.t这种都要用到的参数我们可以放在init初始函数里面,还可以设置个默认值,如下:----(如果你不写在init里面就放在findelement里面传也行。)

    二次封装

    4、这样。一个基本的元素定位封装就好了。但是现在问题还是很多的。比如。我们传值不符合要求时,会报错。我们可以来加个判断。

    二次封装

    5、最后我们还可以打印一下定位的步骤。如下:

    二次封装

    这样。一个较为成熟的元素定位的二次封装的就完成了。且连日志都不需要再去写了。

    之后。像click、sendkeys、clear啥的都这个基础上进行就可以了。

    demo如下:

    二次封装