Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

[Resolved] Python + webdriver ( реализация цикла для выбора оплаты )

unittest
python
Теги: #<Tag:0x00007f7b68eac618> #<Tag:0x00007f7b68eb0bf0>

(Богдан Радченко) #1

День добрый !
Проблема состоит в следуещем, нужен тест который будет формировать корзину и выбирать каждый раз новый “способ оплаты” ( далее PM ).

Проблема следуещего рода:
После формирования корзины заходит на страницу РМ бежит по всем чекбоксам ( выбирая их но не нажимая оплатить ) все.
Страница PM ( http://awesomescreenshot.com/0c24l74bb5 ) имеет чекбоксы, у которых есть ID, НО у IDEAL и Creditcard есть дропдаун меню.

Я создал 3 массива, ИД всех чекбоксов и еще два для названия которые хранят IDEAL / Creditcard ( их выборку делаю с помощью Select)
Не могу грамотно составить цикл чтобы при входе в IDEAL/Credicard выполнились все PM который в них есть, а потом другие ( не важно в какой очередности )

При запуске просто прбегает по всем чекбоксам и ничего не происходит.


def checkCart(ideal, visa, pm): # принимает id всех pm и типы ideal/creditcard
    addToCard(prodadd) # Функция добавления в корзину
         for pm in pm:
        driver.find_element_by_id(pm).click()

        if pm == "ideal":
            Select(driver.find_element_by_id("parentId-ideal")).select_by_visible_text(ideal)
        elif pm == "visa":
            Select(driver.find_element_by_id("parentId-ogonestd")).select_by_visible_text(visa)

    driver.find_element_by_xpath("//div[@id='content']/form/div/div[2]/button").click()

(Богдан Радченко) #2

Вопрос решил.

def checkCart(ideal, visa, pm):

    addToCard(prodadd)
    for idealtext in ideal:
            Select(driver.find_element_by_id("parentId-ideal")).select_by_value(idealtext)
            driver.find_element_by_xpath("//div[@id='content']/form/div/div[2]/button").click()
            driver.get(base_url)
            addToCard(prodadd)



    for visatext in visa:
            driver.find_element_by_id("parentId-ogonestd").click()
            Select(driver.find_element_by_id("parentId-ogonestd")).select_by_visible_text(visatext)
            driver.find_element_by_xpath("//div[@id='content']/form/div/div[2]/button").click()
            driver.get(base_url)
            addToCard(prodadd)

    for cred in pm:
            driver.find_element_by_id(cred).click()
            driver.find_element_by_xpath("//div[@id='content']/form/div/div[2]/button").click()
            driver.get(base_url)
            addToCard(prodadd)

(Mykhailo Poliarush) #3

Задачу решили, вот и хорошо, но я бы все таки рекомендовал бы более усовершенствовать код, так как:

  1. одни и те же локаторы повторяются
  2. локаторы написаны “не идеально”, можно лучше
  3. код нечитабельный, разделяйте логику сценария от непосредственного взаимодействия с страницей
  4. код для всех циклов несколько однотипный, можно увидеть одни и те же вызовы команд, лучше создать одну но универсально-гибкую функцию под три разных случая

А вообще рекомендую посмотреть серию бесплатных видео https://www.youtube.com/playlist?list=PL1B2B74B21CB956A6 а из платных вот эти уроки http://lessons2.ru/lesson/preview/yunit-testirovanie-v-python/ и http://lessons2.ru/lesson/preview/osnovy-avtomatizacii-testirovaniya-veb-prilozhenij-s-selenium-webdriver-na-python/


(Богдан Радченко) #4

Спасибо большое за фидбек