你的输入习惯决定你的封装方式
QUESTION1:必须对原有selenium进行二次封装吗?
- 其实不是必然的,selenium有肥肠庞大的功能操作群,我们进行二次封装时,大概率的会遗忘掉某些功能,不常用但是至关重要。比如:driver.find_element_by_id(value1).find_element_by_id(value2).click(),如果你愿意这个链子你可以写的更长。显而易见的是你肯定不会封装这种无限期的函数,于是某一天的清晨你突发奇想找到了方法,用封装的ELEMENT()和CLICK()函数曲线救国:ELEMENT().CLICK(),恭喜你,你可以去验证你的成果了。
- 所以封装就没有必要了吗?我总是不习惯于每次的find_element_by_id相关输入,太长了有木有!尤其是每次改ID,NAME,XAPATH的时候很麻烦的有木有。所以痛定思痛,我还是对selenium下手了。
QUESTION2:如何封装才能更便于使用呢?
- 最初的版本封装的非常简陋,以至于每次遇到问题的时候都要去完善之前的版本,包括iframe,链式,JS操作等等。所以最重要的一条是***尽量完善你的封装类***让他包罗万象,足以处理你将面临的绝大部分问题。接下来你会问,不便于封装的方法怎么办?
- 我想到的答案是将操作浏览器的方法单独封装,然后作为参数传入到你的Basic()中,即你二次封装selenium类。如此一来的问题就是,每次实例化的时候,你都需要进行2布,首先实例化browser()并将其当作参数传入到Basic()中,曲线救国。
- 其次加入一些异常处理,比如抛出未找到元素的异常等等。
- 只能等待,你值得拥有!
一下是我封装的一些方法,仅供参考。
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
def browser(browser = None):
if browser == 'ie':
driver = webdriver.Edge(EDGE_PATH)
elif browser == 'firefox':
driver = webdriver.Firefox(FIRFOX_PATH)
elif browser == 'opera':
driver = webdriver.Opera(OPERA_PATH)
else:
driver = webdriver.Chrome(CHROME_PATH)
return driver
class Basic():
def __init__(self,driver):
self.driver = driver
def open(self, url, time=15):
"""最大化打开网页"""
self.driver.implicitly_wait(time)
self.driver.maximize_window()
self.driver.get(url)
def element(self, type, value, timeout=10):
"""定位元素"""
try:
if type == 'xpath':
element = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_element_located(
(By.XPATH, value)))
return element
elif type == 'id':
element = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_element_located(
(By.ID, value)))
return element
elif type == 'name':
element = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_element_located(
(By.NAME, value)))
return element
elif type == 'class':
element = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_element_located(
(By.CLASS_NAME, value)))
return element
elif type == 'link':
element = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_element_located(
(By.LINK_TEXT, value)))
return element
elif type == 'css':
element = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, value)))
return element
except BaseException:
print("%s 页面未找到元素 %s" % (self, value))
def elements(self, type, value, timeout=10):
"""定位一组元素"""
try:
if type == 'xpath':
elements = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_all_elements_located(
(By.XPATH, value)))
return elements
elif type == 'id':
elements = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_all_elements_located(
(By.ID, value)))
return elements
elif type == 'name':
elements = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_all_elements_located(
(By.NAME, value)))
return elements
elif type == 'class':
elements = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_all_elements_located(
(By.CLASS_NAME, value)))
return elements
elif type == 'link':
elements = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_all_elements_located(
(By.LINK_TEXT, value)))
return elements
elif type == 'css':
elements = WebDriverWait(
self.driver, timeout, 1).until(
EC.presence_of_all_elements_located(
(By.CSS_SELECTOR, value)))
return elements
except BaseException:
print("%s 页面未找到元素 %s" % (self, value))
def clear(self, type, value):
"""清除文本框"""
element = self.element(type, value)
element.clear()
def text(self, type, value):
"""获取文本内容"""
element = self.element(type, value)
return element.text
def get_attribute(self, type, value, name):
"""获得属性"""
element = self.element(type, value)
return element.get_attribute(name)
def location(self, type, value):
"""获得元素坐标"""
element = self.element(type, value)
return element.location
def size(self, type, value):
"""获取元素尺寸"""
element = self.element(type, value)
return element.size
def save_screenshot(self, filename):
"""截图"""
self.driver.save_screenshot(filename)
def current_url(self):
"""获取当前URL"""
return self.driver.current_url
def title(self):
"""获取当前title"""
return self.driver.title
def quit(self):
"""关闭浏览器"""
return self.driver.quit()
def close(self):
"""关闭窗口"""
return self.driver.close()
def forward(self):
"""前进"""
return self.driver.forward()
def back(self):
"""后退"""
return self.driver.back()
def refresh(self):
"""刷新"""
return self.driver.refresh()
def click(self, type, value):
"""单击"""
element = self.element(type, value)
element.click()
def input(self, type, value, text):
"""清除输入框内容并发送文本"""
element = self.element(type, value)
# element.clear()
element.send_keys(text)
def space(self, type, value):
element = self.element(type, value)
element.send_keys(Keys.SPACE)
def esc(self, type, value):
element = self.element(type, value)
element.send_keys(Keys.ESCAPE)
def enter(self, type, value):
element = self.element(type, value)
element.send_keys(Keys.ENTER)
def jump(self):
"""页面跳转"""
old_handle = self.driver.current_window_handle
handles = self.driver.window_handles
for handle in handles:
if handle != old_handle:
self.driver.switch_to.window(handle)