Как вызвать методы из класса, расположенного в одном файле Python из другого файла Python - PullRequest
0 голосов
/ 29 мая 2019

Я создаю фреймворк, используя Selenium и Python. Моя платформа, управляемая данными, должна состоять (пока) из 3 файлов:

1) Config.py have class Config() that have all the nessesary methods such as: 
   def setUp() - 
   def tearDown()
   def click()
   def send_keys()

2) data.py - with all data 

3) test.py - with all of the steps

В настоящее время я работаю над методом click ().

Я хочу передать 2 параметра этому методу, он будет использовать slice () чтобы определить, какие локаторы я использую, и нажмите соответственно. К сожалению, независимо от того, что я делаю - это держит бросая мне некоторые ошибки.

config.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

class Actions(object):

    def __init__(self, driver):
        self.driver = driver


    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)

    def tearDown(self):
        self.driver.quit()


    def click(self, elemLocator, elemValue):
        elp = elemLocator
        flp = slice(0,2)
        if elp[flp] == 'id':
            try:
                self.driver.find_element_by_id(elemValue).click()
            except:
                pass
        elif elp[flp] == 'xp':
            try:
                self.driver.find_element_by_xpath(elemValue).click()
            except:
                pass
        elif elp[flp] == 'li':
            try:
                self.driver.find_element_by_link_text(elemValue).click()
            except:
                pass
        elif elp[flp] == 'na':
            try:
                self.driver.find_element_by_name(elemValue).click()
            except:
                pass
        elif elp[flp] == 'cs':
            try:
                self.driver.find_element_by_css_selector(elemValue).click()
            except:
                pass
        elif elp[flp] == 'pa':
            try:
                self.driver.find_element_by_partial_link_text(elemValue).click()
            except:
                pass
        elif elp[flp] == 'ta':
            try:
                self.driver.find_element_by_tag_name(elemValue).click()
            except:
                pass
        elif elp[flp] == 'cl':
            try:
                self.driver.find_element_by_class_name(elemValue).click()
            except:
                pass


    def send_keys(self):
        pass

test.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
from Setup import Actions

action = Actions()
action.setUp()

Сообщение об ошибке:

Traceback (most recent call last):
  File "/Users/a./Desktop/Automation_Work/correct_PPLS/oop/Test.py", line 9, in <module>
    action = Actions()
TypeError: __init__() takes exactly 2 arguments (1 given)
[Finished in 0.153s]

Ответы [ 3 ]

0 голосов
/ 29 мая 2019

Вы, кажется, звоните Action() без параметров.Вы фактически вызываете Action.__init__(self), не предоставляя параметр driver.Вот почему вы получаете TypeError: __init__() takes exactly 2 arguments (1 given).Значение 1 self, которое автоматически предоставляется Python, а недостающее значение driver.

0 голосов
/ 29 мая 2019

Просто измените __init__, как показано ниже.

def __init__(self,driver=None):
    if driver != None:
        self.driver = driver

Теперь вы можете звонить на __init__ с или без прохождения драйвера. Однако я предлагаю объявить драйвер вне класса и сделать его глобальным, чтобы вы могли получить к нему доступ в любом месте.

Примерно так:

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
driver = None
class Actions(object):

    def __init__(self, driver):
        self.driver = driver

    def setUp(self,browserName):
        global driver 
        if browserName == 'chrome' #<==== creating the driver based on browser (you can pass this as argument while calling this method)
            self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        # return driver #<==== return driver so that you can store with other name if you are planning to launch 2nd instance of driver.

action = Actions()
action.setUp("chrome")
0 голосов
/ 29 мая 2019

Вы должны создать экземпляр класса, если вы вызываете метод, который не является статическим.

Я не уверен, используете ли вы Python 2 или 3, но вот как вы делаете ваши методы статичными в 2: https://docs.python.org/2/library/functions.html#staticmethod

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...