首页 > 解决方案 > Selenium 在 iframe 中查找登录字段时不一致

问题描述

我正在从https://game-rainbow6.ubi.com/en-us/uplay/player-statistics/dbd1cef3-d69d-4296-a235-ae8d7d70363f/multiplayer抓取统计数据。我正在使用 Selenium 和 python 登录并抓取我想要的统计信息。登录过程都发生在一个名为 player 的类中

webdriver 需要找到两个字段“AuthEmail”和“AuthPassword”。我的问题是,有时它会找到字段并正确登录,但有时会抛出找不到字段的错误。我已经厌倦了隐含的等待,认为它需要 iram 完全加载,但有时我仍然会收到错误。我还尝试了显式等待:

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()

标签: python-3.xseleniumselenium-webdriveriframewebdriverwait

解决方案


所需的元素在 an 内,<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")
    
  • 浏览器快照:

育碧


推荐阅读