python-3.x - 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()
解决方案
所需的元素在 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")
浏览器快照:
推荐阅读
- bash - 用 tr 或类似的交换 bash 中的两个字符
- python - 使用 GroupBy 并使用 Jinja2 将 Pandas Dataframe 渲染为单独的 HTML 文件
- c# - С# LINQ IQueryable Take
- c - OpenGL的工作组大小和本地大小有什么区别?
- r - 基于R中时间序列的平均值删除变量
- spring-boot - Spring Boot REST服务Kafka主题commitSync失败
- sas - 吐出打开的程序中使用的数据源和库
- haskell - 使用 floskell 格式化时,有没有办法不对齐我的代码?
- tableau-api - 使用列的 Tableau 筛选器
- javascript - 如何在第一张幻灯片上使用简单的密码保护网站