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

День добрый !
Проблема состоит в следуещем, нужен тест который будет формировать корзину и выбирать каждый раз новый “способ оплаты” ( далее 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()

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

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)

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

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

А вообще рекомендую посмотреть серию бесплатных видео at.info webinar - YouTube а из платных вот эти уроки Поиск 🔍 организации или лица - Предоставление сведений из ЕГРЮЛ/ЕГРИП в электронном виде и Поиск 🔍 организации или лица - Предоставление сведений из ЕГРЮЛ/ЕГРИП в электронном виде

1 лайк

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