学了相关的自动化教程后,尝试用PO模式写了一个126邮箱登录界面的自动化测试脚本。封装了一个find_element
方法,以便后续写其他模块时调用。find_element
用到的参数都是通过读取配置文件获得。
首先FindElement类中封装find_element方法如下:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from util.read_ini import ReadIni
class FindElement(object):
def __init__(self, driver):
self.driver = driver
def get_element(self, key):
read_ini = ReadIni()
data = read_ini.get_value(key)
by = data.split(">")[0]
value = data.split(">")[1]
wait = WebDriverWait(self.driver, 5, 0.5)
try:
if by == 'id':
return wait.until(EC.presence_of_element_located((By.ID, value)))
#return self.driver.find_element_by_id(value)
elif by == 'name':
return wait.until(EC.presence_of_element_located((By.NAME, value)))
#return self.driver.find_element_by_name(value)
elif by == 'classname':
return wait.until(EC.presence_of_element_located((By.CLASS_NAME, value)))
# return self.driver.find_element_by_class_name(value)
else:
return wait.until(EC.presence_of_element_located((By.XPATH, value)))
# return self.driver.find_elements_by_xpath(value)
except:
return None
def iframe(self, key):
frame = self.get_element(key)
return self.driver.switch_to.frame(frame)
def iframe_out(self):
return self.driver.switch_to.default_content()
一开始使用driver.find_element_by_id(value)
查找元素,后来接触了WebDriverWait,就切换使用WebDriverWait(self.driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, value)))
去查找元素。但是修改写的时候WebDriverWait(driver, 5, 0.5) 中driver前漏加self 。
于是在后面LoginPage类中调用find_element时不起作用。当时各处写print()找原因,多亏一个大神帮我找出了错误。
因为被调用函数没有加self,导致调用函数实例化时参数传不进去。
下面是LoginPage类中封装的方法get_element一系列方法
from base.find_element import FindElement
from selenium import webdriver
class LoginPage(object):
def __init__(self, driver):
self.driver = driver
self.fd_el = FindElement(self.driver)
self.fd_el.iframe('login_iframe')
def get_email_inputbox(self):
return self.fd_el.get_element("email_inputbox")
……