Ввод значений в iframe python selenium shopify платежи - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь использовать селен + python для ввода значений кредитной карты на сайт Shopify. Поля для ввода значений карты находятся в iframe, и я не уверен, как переключиться на этот iframe.

В настоящее время у меня есть этот код:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,
                   '//*[@id="card-fields-number-950kvfi9pbn00000"]'))
                   ).send_keys(card_number, Keys.TAB, name_on_card, Keys.TAB,expiry_date, cvv)
driver.switch_to.default_content()

Но это возвращает ошибку:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(...

selenium.common.exceptions.TimeoutException: Message: 

Таким образом, элемент не может быть найден ...

Это HTML страницы: (https://gyazo.com/80d9d3c941c62ededc81d5fbc327a71f)

Мне нужна помощь, как получить доступ к этому элементу. Я также пробовал получить к нему доступ, изменив идентификатор на родительский элемент этого тега. Я также добавил time.sleep(20), поэтому я могу быть уверен, что страница полностью загружена, и у меня все еще та же ошибка.

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

Вы должны попробовать driver.switch_to_frame("Insert 'Name'of Iframe here"), а затем найти свой элемент. После нахождения элемента. Вы можете попробовать:

ELEMENT.send_keys(card_number, Keys.TAB, name_on_card, Keys.TAB,expiry_date, cvv)
driver.switch_to.default_content()

Но я бы посоветовал искать каждый элемент вместо использования клавиши табуляции. Это упростит исправление или корректировку в будущем, поскольку веб-сайты могут измениться в любое время. По сути, вы можете использовать операторы if для обнаружения полей и, если они есть, заполнить их.

0 голосов
/ 20 июня 2020

Проблема заключалась в том, что имя и идентификатор элемента являются динамическими c и изменяются для каждого уникального окна проверки, это рабочий код:

iframe = driver.find_element_by_class_name('card-fields-iframe')
driver.switch_to.frame(iframe)
driver.find_element_by_name('number').send_keys(card_number, Keys.TAB,name_on_card,Keys.TAB,expiry_date,Keys.TAB, cvv)
driver.switch_to.default_content()
0 голосов
/ 20 июня 2020

Вы можете переключиться на iframe с помощью метода switch_to_frame.

iframe = driver.find_element(By.XPATH, '//*[@id="card-fields-number-950kvfi9pbn00000"]')
driver.switch_to_frame(iframe)
#You're now 'in' the iframe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...