Python+Selenium封装类,请高手赐教

Selenium类封装

#!/usr/bin/env python
#--coding:utf-8-*-
import random
#导入selenium模块
from selenium import webdriver
#selenium键盘事件
#引入 keys 包
from selenium.webdriver.common.keys import Keys

'''
其他常用到的鼠标事件,只需在后面加上,demo: obj.getElementByLinkText('爱情').click()
clear()
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停在一个元素上
click_and_hold() 按下鼠标左键在一个元素上
'''
'''
继承Abstract类
'''
from Abstract import Downloader_Abstract

class Downloader_Selenium(Downloader_Abstract):
    def __init__(self , data = 'firefox'):
        __strs = data.lower()
        if __strs == "firefox":
            self.driver = webdriver.Firefox()
        elif __strs == "chrome":
            self.driver = webdriver.Chrome()
        elif __strs == "phantomjs":
            '''
            若选择phantomjs,给默认加上User-Agent伪装
            '''
            '''
            此段代码用于phantomjs伪装User-Agent
            '''
            from selenium.webdriver import DesiredCapabilities
            desired_capabilities = DesiredCapabilities.PHANTOMJS.copy()
            headers = {
                'Accept': '*/*',
                'Accept-Language': 'en-US,en;q=0.8',
                'Cache-Control': 'max-age=0',
                'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
                'Connection': 'keep-alive',
                'Referer': 'http://movie.douban.com/'
            }
            for key, value in headers.iteritems():
                desired_capabilities['phantomjs.page.customHeaders.{}'.format(key)] = value
                desired_capabilities[
                    'phantomjs.page.customHeaders.User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'
            self.driver = webdriver.PhantomJS(desired_capabilities=desired_capabilities)
        else:
            print "Error Message: Not Installed Firefox or Chrome or PhantomJs"

    '''
    selenium 获取网页源码
    '''
    def getHtml(self , url):
        self.open(url)
        return self.getPageSource()

    '''
    根据标签元素定位并在input框中输入内容
    @:param tag 'id','class','name','tag_name','link_text','partial_link_text'
    @:param element 正则表达式或id,class,Xpath名称
    @:param data 输入的内容
    '''
    def sendKeysByElement(self , tag , element , data):
        if tag == "id":
            return self.getElementById(element).send_keys(data)
        elif tag == "class":
            return self.getElementByClass(element).send_keys(data)
        elif tag == "name":
            return self.getElementByName(element).send_keys(data)
        elif tag == "tag_name":
            return self.getElementByTagName(element).send_keys(data)
        elif tag == "link_text":
            return self.getElementByLinkText(element).send_keys(data)
        elif tag == "partial_link_text":
            return self.getElementByPartialLinkText(element).send_keys(data)
        else:
            print "Error Message: function 'sendKeysByElement' First parameters wrong , select : 'id','class','name','tag_name','link_text','partial_link_text'"

    '''
    selenium 用于打开网页
    '''
    def open(self , url):
        return self.driver.get(url)

    '''
    selenium 获取网页资源
    '''
    def getPageSource(self):
        return self.driver.page_source

    '''
    selenium 获取网页Title
    '''
    def getPageTitle(self):
        return self.driver.title

    '''
    selenium 退出浏览器
    '''
    def quit(self):
        return self.driver.quit()

    '''
    根据 id 定位元素
    '''
    def getElementById(self , element):
        return self.driver.find_element_by_id(str(element))

    '''
    根据 class name 定位元素
    '''
    def getElementByClass(self , element):
        return self.driver.find_element_by_class_name(str(element))


    '''
    根据 name 定位元素
    demo: <input type="submit" name="btnK" jsaction="sf.chk" value="Google 搜索">
          find_element_by_name("btnK")
    '''
    def getElementByName(self , element):
        return self.driver.find_element_by_name(str(element))

    '''
    根据 tag name 定位元素
    find_element_by_tag_name("div")
    '''
    def getElementByTagName(self , element):
        return self.driver.find_element_by_tag_name(str(element))
    
    def getElementByXpath(self , element):
        return self.driver.find_element_by_xpath(str(element))

    '''
    根据 link text定位元素
    demo : <a href="http://news.baidu.com" name="tj_news">新 闻</a>
           <a href="http://tieba.baidu.com" name="tj_tieba">贴 吧</a>
           通过 link text 定位元素:
           find_element_by_link_text("新 闻")
           find_element_by_link_text("贴 吧")
    '''
    def getElementByLinkText(self , element):
        return self.driver.find_element_by_link_text(str(element))

    '''
    根据partial link text定位元素
    @:param element
    demo : <a href="http://news.baidu.com" name="tj_news">新 闻</a>
           <a href="http://tieba.baidu.com" name="tj_tieba">贴 吧</a>
           find_element_by_partial_link_text("新")
           find_element_by_partial_link_text("吧")
    '''
    def getElementByPartialLinkText(self , element):
        return self.driver.find_element_by_partial_link_text(str(element))

    '''
    将页面滚动条移动到页面任意位置
    '''
    def scroll(self , top = random.randint(100,999)):
        topsize = top
        js="var q=document.documentElement.scrollTop="+str(topsize)  
        return self.driver.execute_script(js)
    '''
    获取当前URL
    '''
    def getCurrentUrl(self):
        return self.driver.current_url
    '''
    设置超时时间
    '''
    def setTimeOut(self , times = "60"):
        return self.driver.implicitly_wait(times)
    '''
    设置窗口最大化
    '''
    def setMaxWindow(self):
        return self.driver.maximize_window()

实例化调用类

from selenium.webdriver.common.keys import Keys
from Downloader.Selenium import Downloader_Selenium
import time
import os
import datetime
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
now = datetime.datetime.now()
now_time = now.strftime("%Y-%m-%d %H_%M_%S")

class KeywordTool(object):
    def __init__(self , driver , url):
        self.obj = Downloader_Selenium(driver)
        self.obj.open(url)
        self.obj.setTimeOut()

    def getKeyword(self , domain = "United States" , language = "English" , keyword = ""):
        try:
            #定位国别下拉框
            select_one_xpath = '/html/body/span/span/span[1]/input'
            keywords_input_xpath = '//*[@id="edit-keyword"]'
            self.obj.getElementByXpath('//*[@id="select2-edit-domain-container"]').click()
            self.obj.getElementByXpath(select_one_xpath).send_keys(domain)
            self.obj.getElementByXpath(select_one_xpath).send_keys(Keys.ENTER)
            #定位语言下拉框
            self.obj.getElementByXpath('//*[@id="select2-edit-language-container"]').click()
            self.obj.getElementByXpath(select_one_xpath).send_keys(language)
            self.obj.getElementByXpath(select_one_xpath).send_keys(Keys.ENTER)
            #搜索框输入
            self.obj.getElementByXpath(keywords_input_xpath).clear()
            self.obj.getElementByXpath(keywords_input_xpath).send_keys(keyword)
            self.obj.getElementByXpath(keywords_input_xpath).send_keys(Keys.ENTER)

            try:
                content = self.obj.getPageSource()
                return content
            except Exception as e:
                print e
        except Exception as e:
            print e

    def closeWindow(self):
        return self.obj.quit()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容