Python+Selenium封裝類,請高手賜教

Selenium類封裝

#!/usr/bin/env python
#--coding:utf-8-*-
import random
#導(dǎo)入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 獲取網(wǎng)頁源碼
    '''
    def getHtml(self , url):
        self.open(url)
        return self.getPageSource()

    '''
    根據(jù)標簽元素定位并在input框中輸入內(nèi)容
    @:param tag 'id','class','name','tag_name','link_text','partial_link_text'
    @:param element 正則表達式或id,class,Xpath名稱
    @:param data 輸入的內(nèi)容
    '''
    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 用于打開網(wǎng)頁
    '''
    def open(self , url):
        return self.driver.get(url)

    '''
    selenium 獲取網(wǎng)頁資源
    '''
    def getPageSource(self):
        return self.driver.page_source

    '''
    selenium 獲取網(wǎng)頁Title
    '''
    def getPageTitle(self):
        return self.driver.title

    '''
    selenium 退出瀏覽器
    '''
    def quit(self):
        return self.driver.quit()

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

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


    '''
    根據(jù) 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))

    '''
    根據(jù) 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))

    '''
    根據(jù) link text定位元素
    demo : <a  name="tj_news">新 聞</a>
           <a  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))

    '''
    根據(jù)partial link text定位元素
    @:param element
    demo : <a  name="tj_news">新 聞</a>
           <a  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
    '''
    設(shè)置超時時間
    '''
    def setTimeOut(self , times = "60"):
        return self.driver.implicitly_wait(times)
    '''
    設(shè)置窗口最大化
    '''
    def setMaxWindow(self):
        return self.driver.maximize_window()

實例化調(diào)用類

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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市男翰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纽乱,老刑警劉巖蛾绎,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡租冠,警方通過查閱死者的電腦和手機鹏倘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顽爹,“玉大人纤泵,你說我怎么就攤上這事【翟粒” “怎么了捏题?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肉渴。 經(jīng)常有香客問我公荧,道長,這世上最難降的妖魔是什么同规? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任循狰,我火速辦了婚禮,結(jié)果婚禮上捻浦,老公的妹妹穿的比我還像新娘晤揣。我一直安慰自己桥爽,他們只是感情好朱灿,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钠四,像睡著了一般盗扒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缀去,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天侣灶,我揣著相機與錄音,去河邊找鬼缕碎。 笑死褥影,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的咏雌。 我是一名探鬼主播凡怎,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赊抖!你這毒婦竟也來了统倒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤氛雪,失蹤者是張志新(化名)和其女友劉穎房匆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡浴鸿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年井氢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岳链。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡毙沾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宠页,到底是詐尸還是另有隱情左胞,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布举户,位于F島的核電站烤宙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俭嘁。R本人自食惡果不足惜躺枕,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望供填。 院中可真熱鬧拐云,春花似錦、人聲如沸近她。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粘捎。三九已至薇缅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間攒磨,已是汗流浹背泳桦。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留娩缰,地道東北人灸撰。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像拼坎,于是被迫代替她去往敵國和親浮毯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容