自动化测试+爬虫+数据可视化 (1)关于selenium

2018-12-13  本文已影响0人  糕糕python

前言

在着手完成工程时,需要思考自己需要什么工具,比如这次这个项目,我们最终需要的信息是在http://rank.kongzhong.com/rankweb/wowstop.html?vid=4276041424

然后

再然后

最后我想要的信息才会显示出来

一个一个做,不但没有效率,而且容易出错,为此,写一个自动化爬虫是必不可少的,这个是用来干嘛的呢,主要是用来模拟浏览器点击,最后实现数据截取,因此跟大家介绍作为自动化测试的模块selenium。

第一部分 自动化工具selenium

pip安装selenium,import之,

driver =webdriver.Chrome() #自动化测试所选用浏览器

我选用Chrome内核,也就是谷歌浏览器,自动化测试工具需要下载Chromedriver到指定目录下,网址http://npm.taobao.org/mirrors/chromedriver/,需要注意的是,要与你现在浏览器版本匹配,其实这个问题只有老式的内核才会有,现在新版浏览器Chromedriver已经一一对应,对应版本信息可以在notes.txt中找到


如果实在不清楚,可以参考下面这个关系表
ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71
ChromeDriver v2.42 (2018-09-13)----------Supports Chrome v68-70
ChromeDriver v2.41 (2018-07-27)----------Supports Chrome v67-69
ChromeDriver v2.40 (2018-06-07)----------Supports Chrome v66-68
ChromeDriver v2.39 (2018-05-30)----------Supports Chrome v66-68
ChromeDriver v2.38 (2018-04-17)----------Supports Chrome v65-67
ChromeDriver v2.37 (2018-03-16)----------Supports Chrome v64-66
ChromeDriver v2.36 (2018-03-02)----------Supports Chrome v63-65
ChromeDriver v2.35 (2018-01-10)----------Supports Chrome v62-64

至此selenium准备完毕

selenium常见函数用法

driver.maximize_window() #最大化窗口
driver.get('网址') #输入浏览器网址
driver.page_source #获取当前页面的源代码,相当于requests一样(就是因为这个东西才提醒我可以实现爬虫,非常重要!)
driver.window_handles #获取当前所有网页页面,返回的是一个列表,这个主要是用来选择页面间的切换,比如你进入一个新页面,想要回退到上一个页面,就要用到这个功能。
driver.current_window_handle #获取当前页面位置,同上搭配使用
driver.switch_to.window(handle) #跳转到指定窗口,同上搭配使用

接下来讲述selenium的定位按钮,这个东西主要是模拟鼠标点击、输入等操作,为此我们必须定位到需要的位置,具体位置和定位方式,你可以在需要的信息处,右键点击审查看到。



关于定位方式:展开讲述比较麻烦,因为定位方式和每个人的习惯都不大一样,你可以在网上搜到很多selenium的定位方法,下面列举了几种例子仅供参考。

id 定位

driver.findElement(By.id(“id的值”));

name定位

driver.findElement(By.name(“name的值”));

链接的全部文字定位

driver.findElement(By.linkText(“链接的全部文字”));

链接的部分文字定位

driver.findElement(By.partialLinkText(“链接的部分文字”));

css 方式定位

driver.findElement(By.cssSelector(“css表达式”));

xpath 方式定位

driver.findElement(By.xpath(“xpath表达式”));

Class 名称定位

driver.findElement(By.className(“class属性”));

TagName 标签名称定位

driver.findElement(By.tagName(“标签名称”));

Jquery方式

Js.executeScript(“return jQuery.find(“jquery表达式”)”)

但实际上我在工程中在这个位置并不能用普通的findElenment方法,因为这个位置是实现自动化爬取得关键——findElenments(注意后面有个s,新人往往会搞错这两个这个跟前者很像,但他返回的是一个列表)
接下来再模拟普通的点击就可以了。
以下是本人的selenium代码部分

#-*- coding:utf-8 -*-
from selenium import webdriver   #webdriver就是加载你的浏览器驱动,比如我使用的是谷歌,就是Chrome
from selenium.webdriver.common.by import By #这几个东西都是固定的,是智能等待所需要用到的
from selenium.webdriver.support.ui import WebDriverWait #这几个东西都是固定的,是智能等待所需要用到的
from selenium.webdriver.support import expected_conditions as EC #这几个东西都是固定的,是智能等待所需要用到的
import time
import re
import os
driver =webdriver.Chrome() #启动自动化浏览器Chrome 并赋值
driver.maximize_window() #最大化窗口
driver.get('http://rank.kongzhong.com/rankweb/wowstop.html?vid=4276041424')#让浏览器登录到目标地址
try:
    element = WebDriverWait(driver, 3,0.5).until(
    EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )       #try finally是固定语法,为什么要加这个,是因为服务器响应是需要时间的,根据你的网速而定,因此你必须要等到服务器响应完毕,才能接下来做这一步,当然你直接time.sleep也可以,而这个就是智能等待,还有智能等待不是time,不用每步加一个!智能等待不是time,不用每步加一个!
finally:
    player_ID = driver.page_source      #此处保留当前页面信息,用于后面获得玩家ID名称
    #target = "_blank" > 别扭了吃炮弹补脑啊 < / a >    #给大家看看这个网页中的源码,就是接下来的定位和检索目标
    compile = re.compile("\"_blank\">(.*?)<")      #这是正则表达式,必须要和后面的定位方法对齐,所以筛选逻辑和后者非常像
    player_text = re.findall(compile, str(player_ID)) #正则必须要匹配字符串,稍微变换一下数据类型
    elements = driver.find_elements_by_css_selector("a[target='_blank']")  #定位按钮选用css方法,find_elements,不知道的同学可以去网上查用法
    for i in range(len(elements)):     #循环elements,这是一个列表,也就是所有应该点击的玩家名单
        elements[i].click()  #依次进入每个玩家的名单
        windows = driver.current_window_handle   #这个前面说到过,是用来跳转窗口的,因为你点击之后,是生成一个新页面。如果你用定位按钮,机器只会傻乎乎的停留在最开始的页面
        all_handles = driver.window_handles      #获取当前所有窗口,返回的是一个地址
        for handle in all_handles:
            if handle != windows:
                driver.switch_to.window(handle)   #简单的逻辑意思是,如果当前窗口不是windows,则跳转到handle,直到是当前操作的窗口为止
        driver.find_element_by_id("shiptablebtn").click()    #模拟点击舰船成绩那一栏
        time.sleep(2)     #主要是让这个过程可视化,让我能监控到机器操作,实际上我觉得模拟人工操作这一点还是很重要的,毕竟速度太快不厚道···
        driver.find_element_by_css_selector("tr[vid='4276041424']").click()  #点开详细信息,得到目标战斗信息
        time.sleep(3) #同上
        page = driver.page_source  #收集资料
        with open("textdata",'a',encoding="utf-8") as local:     #这是我用来保存的方法
            compile2 = re.compile("<td>(2018-\d\d-\d\d)</td>.*?<td>(\d)</td>.*?class=\"int\"\stitle=.*?<td\sclass=\"int\spercent\">([\d][\d][\d]%).*?")
            # < td class ="double1 percent" > 100.0 % < / td >
            # < span id = "nick" > 别扭了吃炮弹补脑啊 < / span
            datafindall = re.findall(compile2, page)
            for item in datafindall:
                local.write(str(item))
                local.write("\n")
        ospath = "F:/pycharm data/自动化测试/textdata"     #重命名文件名称,这是旧文件目录,你们可以稍微修改一下
        ospath_new = "F:/pycharm data/自动化测试/资料/%s" % player_text[i]  # 4.这段代码是用来智能化命名文本名称的
        os.rename(ospath, ospath_new)
        driver.switch_to.window(all_handles[0])     #all_handles[0]实际上就是第一页
        time.sleep(2)
    print("执行完毕")
    driver.quit()    #退出
上一篇 下一篇

猜你喜欢

热点阅读