python selenium 对 webdirver 简要封装思路

为记录个人在使用webdriver的过程中,为了使代码进一步简洁,通过配置文件分离减少耦合的过程

先上完整代码:

# encoding:utf-8
import configparser
import os

from selenium import webdriver
from datetime import datetime

# 对webdriver进行简单封装
class BaseWebdriver(object):

    def __init__(self):
    	#所有driver.find_element_xxx 方法最后调用的都是依靠find_element(BY.XX)
        self.by_list = ["xpath", "link text", "partial link text", "name", "tag name", "class name", "css selector",
                        "id"]
        driver_path = os.path.dirname(os.path.dirname(__file__)) + '/DriverDir/chromedriver.exe'
        # 这里使用的chromedriver,driver_path是chromedriver的位置
        self.driver = webdriver.Chrome(driver_path)

    def get(self, url):
        return self.driver.get(url)

    def element(self, name):
        for by in self.by_list:
        	# 这里通过多种方式对find方式迭代,例如:当by = id时,表示这个元素可以使用 find_elements(id,name)找到。在如:当by=xpath时,表示这个元素可以使用find_elements(xpath,name)找到.
            if self.driver.find_elements(by, name):
                return self.driver.find_element(by, name)

    def is_exist(self, name):
    #find_elements不存在会返回[].长度为0,如果长度为1,则代表存在这个元素.可以借此判断元素是否存在
        ele_list = [self.driver.find_elements(i, name) for i in self.by_list]
        for i in ele_list:
            if len(i) > 0:
                return True
        return False

    def get_screenshot(self):
        time = datetime.now().strftime('%Y%m%d%H%M%S')
        self.driver.save_screenshot(time + '.png')

可能会有人不太理解,为什么可以使用driver.find_element(by, name)找到定位的元素。这里我们拿find_element_by_id()举例:先点开find_element_by_id源码

  def find_element_by_id(self, id_):
        """Finds an element by id.
        :Usage:
            element = driver.find_element_by_id('foo')
        """
        return self.find_element(by=By.ID, value=id_)

调用find_element_by_id(),返回了self.find_element(by=By.ID, value=id_),点击查看By源码

class By(object):
    """
    Set of supported locator strategies.
    """
    ID = "id"
    XPATH = "xpath"
    LINK_TEXT = "link text"
    PARTIAL_LINK_TEXT = "partial link text"
    NAME = "name"
    TAG_NAME = "tag name"
    CLASS_NAME = "class name"
    CSS_SELECTOR = "css selector"

可以得到By.ID 实际上就是 'id’。同理也可以使用’xpath’来替代By.XPATH,以此类推。
如果有兴趣还可以点击查看find_element的源码,比如find_element本质上是调用execute…这里就暂不啰嗦了,下面是简单的使用方法:模拟登陆csdn的账号

# encoding:utf-8
driver = BaseWebdriver()
config = ConfigParser()
driver.get('https://www.csdn.net/')
driver.element('userinfo').click()
time.sleep(2)
driver.element('//*[@class="main-select"]/ul/li[2]/a').click()
driver.element('all').send_keys('username')
driver.element('pwd').send_keys('password')
driver.element('//button[text()="登录"]').click()

你可能感兴趣的:(selenium,python,selenium)