美文网首页我爱编程
Python+Selenium封装类,请高手赐教

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

作者: lalala2016 | 来源:发表于2017-02-09 18:44 被阅读0次

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()

相关文章

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

    Selenium类封装 实例化调用类

  • Python&selenium 自动化测试框架之日志封装

    Python+selenium自动化测试框架中需要封装一个简单的日志类,用于后续日志输出:1.使用Python中的...

  • 请赐教

    有人全款买房 却说怕今后付不起按揭 '对未来不自信 想想也是有道理的 你给我分析分析

  • 请赐教!

    上联:学习好,工作好,衣食无忧。 下联:人品好,修养好,百世流芳。 横批:自强不息

  • 《请赐教》

    楚语清做了个很沉闷、很憋屈的怪梦,梦见自己被一群凶神恶煞的女人围攻,最后落得奄奄一息,还被对方扔进了无人的乱葬岗。...

  • 请赐教

    孩子们最难的事儿是写作文。 昨天写习作二《童年趣事》,正处于童年的孩子们,玩起来劲头十足,说起来眉飞色舞,拿起笔写...

  • 不懂书法

    请赐教

  • 闲来无事

    请大神赐教!^+^

  • 2020-05-27

    师 傅,请赐教

  • 草书诀2

    初写请赐教。

网友评论

    本文标题:Python+Selenium封装类,请高手赐教

    本文链接:https://www.haomeiwen.com/subject/vkdwittx.html