2015-08-12 5 views
2

У меня есть два файла:NameError при вызове метода

содержатся все мои функции funclib.py

import os 
from selenium import webdriver 
from selenium.webdriver.firefox.webdriver import WebDriver 
from selenium.webdriver.common.action_chains import ActionChains 
import time 

     def deviceSelection(): 
      desired_caps = {} 
      desired_caps['appium-version'] = '1.0' 
      desired_caps['platformName'] = 'iOS' 
      desired_caps['platformVersion'] = '8.2' 
      desired_caps['deviceName'] = 'iPhone 6' 
      desired_caps['app'] = os.path.abspath('/Users/admin/Library/Developer/Xcode/DerivedData/testapp-bfpdodvceugohuaaiiukkrcsrdqh/Build/Products/Debug-iphonesimulator/testapp.app') 
      global wd 
      wd = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps) 
      wd.implicitly_wait(60) 

И у меня есть еще один файл scripts.py который будет вызывать эту функцию.

import os 
from selenium import webdriver 
from selenium.webdriver.firefox.webdriver import WebDriver 
from selenium.webdriver.common.action_chains import ActionChains 
import time 
import sys 
sys.path.append('/Users/admin/Desktop/Suite/Global Scripts/') 
from funcLib import * 

deviceSelection(); 

def firsttri(): 
    wd.find_element_by_name("Accept").click() 
    time.sleep(5) 
    wd.find_element_by_name("Sign In").click() 
    time.sleep(5) 
    wd.find_element_by_name("Need help?").click() 
    time.sleep(5) 
    wd.find_element_by_name("Close").click() 
    time.sleep(5) 


firsttri(); 

Когда я исполняю scripts.py, я получаю сообщение об ошибке

wd.find_element_by_name("Accept").click() 
NameError: global name 'wd' is not defined 

Не знаю, почему. Может кто-нибудь мне помочь ?

+1

wd определяется только локально, а не глобально. Когда deviceSelection() заканчивается, wd больше не существует. – Stiffo

+0

Предлагаемое чтение: учебник python по [Глобальные и локальные переменные] (http://www.python-course.eu/global_vs_local_variables.php) – Mel

+0

@Stiffo: Я объявил wd глобальной переменной. Но все равно такая же ошибка –

ответ

1

Вы немного сбиты с толку как о том, как на Python работает здесь.

При вызове deviceSelection() это не создает wd, что это global в файле scripts.py, это глобальный в файле funclib.py, и именно поэтому вы не можете назвать это.

Есть способы устроить так, чтобы глобальное использование работало, но они грязные, и вы не должны. Вместо этого вы должны исключить использование global и return объекта wd.

def deviceSelection(): 
    desired_caps = {} 
    desired_caps['appium-version'] = '1.0' 
    desired_caps['platformName'] = 'iOS' 
    desired_caps['platformVersion'] = '8.2' 
    desired_caps['deviceName'] = 'iPhone 6' 
    desired_caps['app'] = os.path.abspath('/Users/admin/Library/Developer/Xcode/DerivedData/testapp-bfpdodvceugohuaaiiukkrcsrdqh/Build/Products/Debug-iphonesimulator/testapp.app') 
    wd = webdriver.Remote('http://0.0.0.0:4723/wd/hub', desired_caps) 
    wd.implicitly_wait(60) 
    return wd 

Потому что тогда вы можете просто установить wd внутри самой scripts.py.

wd = deviceSelection() 

В целом рекомендуется использовать return заявления, а не global передать переменные из одного пространства имен в другое, потому что это чище и более явным, и это позволяет избежать путаницы случаев, как это.

+0

Он отлично работает. Спасибо –

+0

@remyathomas Рад, что это помогло. Не забудьте повысить полезные ответы и отметить, какой ответ был наиболее полезен как «принятый». – SuperBiasedMan

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