Selenium несовместим с поиском полей входа в iframe - PullRequest
0 голосов
/ 20 декабря 2018

Я переписываю статистику с https://game -rainbow6.ubi.com / en-us / uplay / player-statistics / dbd1cef3-d69d-4296-a235-ae8d7d70363f / мультиплеер .И я использую Selenium и Python, чтобы войти и очистить статистику, которую я хочу.Процесс входа в систему происходит в классе player

Веб-драйверу необходимо найти два поля: «AuthEmail» и «AuthPassword».Моя проблема в том, что иногда он находит поля и регистрируется правильно, но иногда выдает ошибку, что он не может найти поля.Я устал от неявного ожидания, думая, что для полной загрузки нужен ифрам, но иногда я получаю сообщение об ошибке.Я также попробовал явное ожидание с:

WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.ID, "AuthEmail"))

, но я получаю ошибку, что мои:

__init__ function takes 2 args and I gave it 3

Испытания кода:

def __init__(self, player_name):
    self.driver = webdriver.Chrome()
    self.player_stats = {}
def login(self):

        #login pop up is in a different IFrame, switch to it
    iframe = self.driver.find_element_by_tag_name('iframe')
    self.driver.switch_to.frame(iframe)

    login_email = self.driver.find_element_by_id('AuthEmail')
    login_email.send_keys('')
    login_pwd = self.driver.find_element_by_id('AuthPassword')
    login_pwd.send_keys('')
    submit_button = self.driver.find_element_by_id('LogInButton')
    submit_button.click()

    #Switch driver back to main webpage for webscraping
    self.driver.switch_to.default_content()

1 Ответ

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

Требуемые элементы находятся в пределах <iframe>, поэтому вам необходимо:

  • Вызвать WebDriverWait , чтобы требуемый кадр был доступен, и переключиться на него .
  • Индуцируйте WebDriverWait , чтобы требуемый элемент был активным .
  • Можно использовать следующее решение:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    options = Options()
    options.add_argument("start-maximized")
    options.add_argument("disable-infobars")
    options.add_argument("--disable-extensions")
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://game-rainbow6.ubi.com/en-us/uplay/player-statistics/dbd1cef3-d69d-4296-a235-ae8d7d70363f/multiplayer")
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.ng-scope.ng-isolate-scope.rs-template-uplay-connect")))
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.form-control#AuthEmail"))).send_keys("DMatza")
    driver.find_element_by_css_selector("input.form-control#AuthPassword").send_keys("DMatza")
    
  • Снимок браузера:

ubisoft

...