2016-09-19 1 views
1

Я пытаюсь написать тест в Selenium с помощью питона,Использование ARG парсер в питона в другом классе

мне удалось запустить тест, и это прошло, но теперь я хочу добавить ARG парсер, так что я могу дать проверьте другой URL-адрес в качестве аргумента.

Дело в том, что мой тест внутри класса, Так что, когда я передаю аргумент я получаю сообщение об ошибке:

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

Как я могу получить арг быть определен внутри класса Selenium?

Это мой код:

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» во время этой установки класса; и, возможно, печать 'args' в вашем' main'-блоке. – 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

Спасибо за ответ. Но я по-прежнему получаю ту же ошибку. Положите парсер = argparse.ArgumentParser (...) и parser.add_argument() вне, если __name__ == "__main__": и Keep args = vars (parser.parse_args()) внутри __main__. –

+0

Почему вы используете 'vars()'? Просто используйте 'args = parser.parse_args()'. См. Редактирование, чтобы возвращать 'args' вместо парсера. – aneroid

Смежные вопросы