Selenium IDE работает, а Python Selenium - нет: возможно, проблема с iFrame - PullRequest
0 голосов
/ 17 декабря 2018

Я создал код с использованием расширений Chrome Selenium IDE, который работает правильно.Я создал код, который выполняет те же шаги в Python.Проблема заключается в следующем: когда я запускаю код Python, он не может найти элемент по идентификатору, что Selenium IDE не имеет проблем с поиском.Элемент находится в iFrame, поэтому я отвечаю за это, и при загрузке iFrame не выдается никаких ошибок.

Здесь находится веб-сайт, на котором я пытаюсь ввести кодовое слово и адрес электронной почты.

Ниже приведено описание обоих кодовых наборов.

side-by-side

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time

options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument("--test-type")
#options.add_argument("--incognito")
options.binary_location = r'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe'
driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Users\James\Documents\Scripts\lib\chromedriver.exe')
#driver.set_page_load_timeout(30)

actions = ActionChains(driver) 


driver.get('https://alt949.radio.com/contest/holiday-feast-win-free-tickets#//')
for _ in range(2):
    driver.find_element_by_tag_name('body').send_keys(Keys.PAGE_DOWN)
time.sleep(10)

#Switch to iframe
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))

#Set keyword
keyword_input = driver.find_element_by_id('ember634')
keyword_input.send_keys('keyword')

driver.switch_to.default_content()

Спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Похоже, что 'ember' идентификаторы могут меняться со временем (возможно, генерируется распределенной CMS), поэтому требуется другой подход к идентификации поля.Приведенный ниже код поможет вам надежно пройти первый экран.Кроме того, поскольку это интерактивная форма, я переключился на модель ожидания, а не использовал таймер сна.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Set options to simplify flow and persist user data 
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('disable-infobars')
chrome_options.add_argument('start-maximized')
chrome_options.add_experimental_option('prefs', {'credentials_enable_service': False, 'profile': {'password_manager_enabled': False}})

print("Loading page")
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://alt949.radio.com/contest/holiday-feast-win-free-tickets#//')

print("Find frame")
element = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//iframe[@data-ss-embed='iframe']")))
driver.switch_to.frame(element)

print("Enter codeword")
element = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".ssRegistrationField.ssTextboxField.ember-text-field.ember-view")))
element.click()
element.send_keys('codeword')

print("Enter email")
element = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".ssRegistrationField.ssEmailTextboxField.ember-text-field.ember-view")))
element.click()
element.send_keys('myemail@gmail.com')

print("Click Continue")
element = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CLASS_NAME, 'ssButton')))
element.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...