2016-09-19 18 views
1

我試圖使用python寫的硒測試中使用Python ARG解析器,在另一類

我設法運行測試,它通過了,但現在我想補充ARG解析器,所以我可以給測試一個不同的URL作爲參數。

的事情是,我的測試是一個類裏面, 所以,當我路過的說法我得到一個錯誤:

app_url= (args['base_url']) 
NameError: global name 'args' is not defined 

我怎樣才能將硒類中定義ARGS?

這是我的代碼:

from selenium.common.exceptions import NoSuchElementException 
from selenium.common.exceptions import NoAlertPresentException 
from selenium import webdriver 
import unittest, time, re 
import os 
import string 
import random 
import argparse 


def id_generator(size=6, chars=string.ascii_uppercase + string.digits): 
    return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8)) 
agmuser = id_generator() 

class Selenium(unittest.TestCase): 
    def setUp(self): 
     chromedriver = "c:\chromedriver.exe" 
     os.environ["webdriver.chrome.driver"] = chromedriver 
     self.driver = webdriver.Chrome(chromedriver) 
     app_url = (args['base_url']) 
     #app_url= "http://myd-vm16635.fufu.net:8080/" 
     print "this is the APP URL:" + ' ' + app_url 
     self.base_url = app_url 
     self.verificationErrors = [] 
     self.accept_next_alert = True 

def test_selenium(self): 

    #id_generator.user = id_generator() 
    driver = self.driver 
    driver.get(self.base_url + "portal/") 
    driver.find_element_by_css_selector("span").click() 
    driver.find_element_by_id("j_loginName").clear() 
    driver.find_element_by_id("j_loginName").send_keys(agmuser) 
    driver.find_element_by_id("btnSubmit").click() 
    driver.find_element_by_link_text("Login as" + ' ' + agmuser).click() 
    driver.find_element_by_css_selector("#mock-portal-Horizon > span").click() 
    # driver.find_element_by_id("gwt-debug-new-features-cancel-button").click() 
    # driver.find_element_by_xpath("//table[@id='gwt-debug-module-dropdown']/tbody/tr[2]/td[2]").click() 
    # driver.find_element_by_id("gwt-debug-menu-item-release-management").click() 

def is_element_present(self, how, what): 
    try: self.driver.find_element(by=how, value=what) 
    except NoSuchElementException as e: return False 
    return True 

def is_alert_present(self): 
    try: self.driver.switch_to_alert() 
    except NoAlertPresentException as e: return False 
    return True 

def close_alert_and_get_its_text(self): 
    try: 
     alert = self.driver.switch_to_alert() 
     alert_text = alert.text 
     if self.accept_next_alert: 
      alert.accept() 
     else: 
      alert.dismiss() 
     return alert_text 
    finally: self.accept_next_alert = True 

def tearDown(self): 
    self.driver.quit() 
    self.assertEqual([], self.verificationErrors) 

if __name__ == "__main__": 
    #####################******SCRIPT PARAMS****;**################################### 
    # these values can be changed type 'python selenium_job.py --help' for assistance 
    ################################################################################## 
    parser = argparse.ArgumentParser(description='DevOps team - Sanity test') 
    parser.add_argument('-b', '--base_url', help='base_url', default="http://myd-vm16635.fufu.net:8080/") 
    args = vars(parser.parse_args()) 
    unittest.main() 
+0

你縮進是關閉的;所有這些'def ...(self)'都應該縮進,以便它們成爲班級的一部分 - 對嗎? – hpaulj

+0

您是直接調用此腳本;或間接通過一些'unittest'工具?作爲診斷,我建議在該課程安裝期間添加一個'print sys.argv';也可能在你的'main'塊中有'args'的打印。 – hpaulj

回答

0

parser = argparse.ArgumentParser(...)parser.add_argument()if __name__ == "__main__":,使其始終被創建,但不進行評估。保留args = vars(parser.parse_args())__main__之內。

通過這種方式,您可以從像from selenium_tests import parser這樣的文件導入文件,然後在您的其他腳本中執行parser.parse_args()

和清潔的方式來做到這一點是建立返回解析器,像函數:

def get_parsed_args(): 
    parser = argparse.ArgumentParser(...) 
    parser.add_argument(...) 
    # etc. 
    args = parser.parse_args() 
    return args 
    # or just... 
    return parser.parse_args() 

#and then call that in the main program: 

if __name__ == '__main__': 
    args = get_parsed_args() 
    # etc. 

而且要在其中將其導入到其它腳本,做

from selenium_tests import get_parsed_args 

if __name__ == '__main__': 
    args = get_parsed_args() 
    # etc. 
+0

感謝您的回答,但是如果__name__ ==「__main__」,那麼在放置parser = argparse.ArgumentParser(...)和parser.add_argument()之後,我仍然會得到相同的錯誤:並且保留args = vars(parser.parse_args ())在__main__裏面。 –

+0

你爲什麼使用'vars()'?只需使用'args = parser.parse_args()'。請參閱編輯以返回'args'而不是解析器。 – aneroid