Как собрать мои функции вместе, чтобы убедиться, что переменная драйвера может использоваться всеми 3

#python #function #selenium

#python #функция #селен

Вопрос:

У меня есть 3 функции. Login, Contacts_object и Object_menu . Каков наилучший способ собрать их вместе, чтобы я мог их запустить. У меня возникли проблемы с передачей переменной driver функциям Contacts_object и Object_menu, как это объявлено в Login . Это 3 вложенных цикла for . как только вы дойдете до конца 3-го цикла for, драйвер должен закрыться, и мы начнем снова со следующего входа в функцию входа.

Я попытался поместить драйвер в отдельный файл .py и импортировать его. однако это не работает.

 def login(Test_Account, Password):
    launch url
    url = "XXXXXXXX"

    for x, y in zip(Test_Account, Password):
        driver = webdriver.Chrome()
        driver.implicitly_wait(1)
        driver.get(url)

        username = driver.find_element_by_id("FORMLOGINid")
        password = driver.find_element_by_id("FORMLOGINpwd")

        username.send_keys(x)
        password.send_keys(y)

        python_button = driver.find_element_by_id('btSubmit') #
        python_button.click() #click 

        driver.implicitly_wait(1)


def contacts_object(Open_Contacts):
    for b in  Open_Contacts: 

    ##########################################################
        python_menu_dropdown = driver.find_element_by_id('id_arrow_popup_menu')
        python_menu_dropdown.click()
        time.sleep(1)
############################################################################

        python_menu_open = driver.find_element_by_id('id_popup_OPEN')
        python_menu_open.click()
        time.sleep(1)
        x = driver.find_element_by_xpath(b)
        x.click()
        time.sleep(2)
        search_contact = driver.find_element_by_id('id_searchfield')
        search_contact.clear()
        time.sleep(1)
        search_contact = driver.find_element_by_id('id_searchfield')
        search_contact.send_keys("Test, Acco")
        time.sleep(1)
        search_contact.send_keys(Keys.DOWN   Keys.ENTER)
        time.sleep(5)


def object_menu(Profile, folders):

    for z in folders:

        drop_down = driver.find_element_by_id('folder_panels_arrow')
        drop_down.click()
        if z == len(folders):
            break
        #print(z)
        try:
            python_menu_open = driver.find_element_by_xpath(z)
            driver.implicitly_wait(10)
            if EC.element_to_be_clickable(z):
                python_menu_open.click()
            driver.implicitly_wait(20)    
            time.sleep(20)
            page = driver.execute_script("return document.body.innerHTML").encode('utf-8') #returns the inner HTML as a string
            soup = BeautifulSoup(page, 'html.parser')
            soup = soup.prettify()
            t = time.localtime()
            timestamp = time.strftime('%b-%d-%Y_%H%M', t)
            filepath = os.path.join("XXXXXXXXXXXXX")
            time.sleep(5)
            h = open(filepath, "w")
            h.write(soup)
            h.close()

        except NoSuchElementException:
            f = open(r'XXXXXXXXXXXXX')
            f.write(str(Profile )   " not there"  'n')
            f.close()

    driver.close()
  

Комментарии:

1. Сделать class ?

2. Кто-нибудь может помочь мне настроить класс на python, я никогда раньше не использовал класс. Спасибо

3. Вопрос не по теме, но это должно указать вам правильное направление: selenium-python.readthedocs.io/page-objects.html

4. Как мне настроить класс, чтобы при достижении конца цикла For в def Login я запускал цикл For в def contacts_object?

5. можно ли в любом случае сохранить их в виде 3 отдельных файлов .py и вызвать их из одного файла?