数据驱动测试. 使用 Selenium Python 从 .json 或 .yaml 文件中读取参数



我使用Selenium和Python创建了一个框架。 到目前为止,我的数据驱动框架由 2 个文件组成: 第一个文件Setup.py包含类Actions()包含我将使用的所有可能的功能 在我的框架中,例如:

def __init__(): 
def setup():
def tearDown():
def click():
def sendKeys():

我的clicksendKeys函数至少有 2 个参数。 他们采用第一个参数,例如我们:id_for_elementxp_for_elementcss_for_element,将单词切成薄片直到 他们得到第一个两个字符,并通过任一方式查找元素 ID,XP或任何其他方式。然后他们使用第二个参数来 指定元素的值,以及要指定的第三个参数send_keys()函数的值。所有这些功能 现在可以工作,但到目前为止,值在我的测试文件中进行了硬编码。

setup.py file

from   selenium import webdriver
from   selenium.webdriver.common.by import By
from   selenium.webdriver.common.keys import Keys
from   selenium.webdriver.support.ui import Select
from   selenium.common.exceptions import NoSuchElementException
from   selenium.common.exceptions import NoAlertPresentException
class Actions(object):
def __init__(self,driver=None):
if driver != None:
self.driver = driver
def setUp(self, browserName):
if browserName == 'Chrome':
self.driver = webdriver.Chrome()
self.driver.delete_all_cookies()
self.driver.maximize_window()
elif browserName == 'Safari':
self.driver = webdriver.Safari()
self.driver.delete_all_cookies()
self.driver.maximize_window()
elif browserName == 'Firefox':
self.driver = webdriver.Firefox()
self.driver.delete_all_cookies()
self.driver.maximize_window()
self.driver.implicitly_wait(30)
def tearDown(self, browserName):
self.driver.quit()
def webPage(self):
self.driver.get('https://www.yahoo.com')
def click(self, elemLocator, elemValue):
elp = elemLocator
flp = slice(0,2)
if elp[flp] == 'id':#return by ID
try:
self.driver.find_element_by_id(elemValue).click()
except:
pass
elif elp[flp] == 'xp':#return by XPATH
try:
self.driver.find_element_by_xpath(elemValue).click()
except:
pass

def sendKeys(self, elemLocator, elemValue, messageValue):
elp = elemLocator
flp = slice(0,2)
if elp[flp] == 'id':#return by ID
try:
self.driver.find_element_by_id(elemValue).click()
self.driver.find_element_by_id(elemValue).clear()
self.driver.find_element_by_id(elemValue).send_keys(messageValue)
except:
pass
elif elp[flp] == 'xp':#return by XPATH
try:
self.driver.find_element_by_xpath(elemValue).click()
self.driver.find_element_by_xpath(elemValue).clear()
self.driver.find_element_by_xpath(elemValue).send_keys(messageValue)
except:
pass
#test.py file
from Setup import Actions
class test_case_1: #find element by id
action = Actions(object)
action.setUp('Chrome')
action.webPage()
action.click('id_of_yahoo_logo', 'uh-logo')
action.tearDown('Chrome')

class test_case_2: #find element by xpath
action = Actions(object)
action.setUp('Chrome')
action.webPage()
action.click('xp_of signIn_button', '//*[@id="uh-signin"]')
action.tearDown('Chrome')
class test_case_3: #login to email
action = Actions(object)
action.setUp('Chrome')
action.webPage()
action.click('xp_of signIn_button', '//*[@id="uh-signin"]')
action.sendKeys('id_username_login_inp_field','login-username','deniska')
action.click('id_of submit_button', 'login-signin')
action.tearDown('Chrome')

相反,我正在尝试从另一个参数传递值 数据驱动测试最佳实践中所述的文件 框架。我的下一步是创建一个data.json文件 我将在下面用于映射 DOM 的所有元素 格式:"id_login_button":"一些 id 值", "xp_input_field":"一些 XP值"等。有人可以帮我弄清楚吗 如何实现此技术?

如果你想使用 json 作为你的 uiRepo,这里有一个简单的方法。

sample.json:

{
"id_of_yahoo_logo":"uh-logo",
"xp_of_signIn_button":"//*[@id='uh-signin']",
"id_username_login_inp_field":"New York",
"id_of_submit_button":"login-signin"
}

test.py

# you have to just specify the name as shown below
action.click('xp_of_signIn_button)

读取值(Actions.py):

import json
#parse json
with open('sample.json') as f:
uiRepo = json.load(f)
# update the generic methods to get the property form json
print(uiRepo['id_of_yahoo_logo'])

编辑 1:setup.py未经测试的更新

from   selenium import webdriver
from   selenium.webdriver.common.by import By
from   selenium.webdriver.common.keys import Keys
from   selenium.webdriver.support.ui import Select
from   selenium.common.exceptions import NoSuchElementException
from   selenium.common.exceptions import NoAlertPresentException
import json
class Actions(object):
# initialize uiRepo
uiRepo = None
def __init__(self,driver=None):
if driver != None:
self.driver = driver
# load the uiRepo from json when you init the driver
with open('sample.json') as repo:
uiRepo = json.load(repo)
def setUp(self, browserName):
browserName = browserName.lower()
if browserName == 'chrome':
self.driver = webdriver.Chrome()
elif browserName == 'safari':
self.driver = webdriver.Safari()
elif browserName == 'firefox':
self.driver = webdriver.Firefox()
self.driver.delete_all_cookies() #< === moved this line
self.driver.maximize_window() #< === moved this line
self.driver.implicitly_wait(30)
def tearDown(self): #< === Removed browser here as you don't need browser name while closing it.
self.driver.quit()
def webPage(self,url): #< === Added url as param, rather hard code
self.driver.get(url)
# new method to get the element based on the jsonKey
def getElement(self, jsonKey):
locatorStrategy = jsonKey[:2]  # <=== getting first 2 chars to figure out if it's id/xp
locator = uiRepo[jsonKey]  # < == getting value from json
ele = None
try:
if locatorStrategy == 'id':  # return by ID
ele =  self.driver.find_element_by_id(locator).click()  # <=== using the locator got from json
elif locatorStrategy == 'xp':  # return by XPATH
ele =  self.driver.find_element_by_xpath(locator).click()
except:
pass
# if you want you can add additional logic something like highlighting the element
return ele
def click(self, jsonKey): # < ==== updated method to accept only jsonElementName (Removed the element value param)
ele = self.findElement(jsonKey)
ele.click()

最新更新