为记录个人在使用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()