如何使用 Selenium 和 Python 在 iframe 中输入文本

How to enter text in an iframe with Selenium and Python

我正在尝试将 Selenium 与 Python 结合使用来自动登录到 Autodesk GBS。我已经能够像这样访问“登录”框架:

driver.get("https://gbs.autodesk.com/GBS/")
btn = driver.find_element_by_link_text('Sign In')
btn.click()

我似乎无法访问弹出的用户名文本输入元素。我认为它在一个 iframe 中,但根据我得到的“NoSuchElementException”出现次数,页面上显然有 3 个 iframe 的 none 似乎包含一个 ID 为“userName”的元素。

我要访问的文本字段的 HTML 代码在这里:

<input id="userName" name="UserName" autocomplete="off" aria-label="Email text field" tabindex="1" placeholder="name@example.com" type="text" autofocus="autofocus" autocorrect="off" autocapitalize="off" data-val="true" data-val-required="Please enter an email" data-val-length-max="200" class="form-control  customInput2 populated valid">

周围 iframe(我认为)的 HTML 代码在这里:

<iframe frameborder="0" hspace="0" scrolling="no" src="/GBS/Authentication/Authenticate?redirectUrl=%2FGBS%2FProject&amp;requestMode=Setup&amp;isIframe=True" allowtransparency="true" style="border: none; width: 345px; height: 513px;">
...
</iframe>

我对 Selenium 和 Python 都很陌生,经过两天的尝试,我完全迷失了。任何帮助都将非常感激!

更新: 感谢下面 arunkvelu 和 arundeep chohan 的建议,我对我的代码进行了一些更改(完整地发布在下面)。但是它仍然无法找到用户名字段(请参阅下面的错误)。建议?

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

PATH = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(PATH)

driver.get("https://gbs.autodesk.com/GBS/")
btn = driver.find_element_by_link_text('Sign In')
btn.click()

wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//div[@id='oxygen-container']/iframe")))

username_field = driver.find_element_by_id("userName")
username_field.send_keys("test@mail.com")

driver.find_element_by_id("verify_user_btn").click()

password = driver.find_element_by_id("password")
password.send_keys("mypassword")

File "...", line 17, in username_field = driver.find_element_by_id("userName") selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="userName"]"} (Session info: chrome=86.0.4240.183)

有一个 iframe

<iframe frameborder="0" hspace="0" scrolling="no" src="/GBS/Authentication/Authenticate?redirectUrl=%2FGBS%2FProject&amp;requestMode=Setup&amp;isIframe=True" allowtransparency="true" style="border: none; width: 345px; height: 513px;"></iframe>

您可以通过以下方式切换到它。

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//*[@id='oxygen-container']/iframe")))

导入

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

这是完整的东西

driver.get("https://gbs.autodesk.com/GBS/")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Sign In"))).click()
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//*[@id='oxygen-container']/iframe")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "userName"))).send_keys("test@mail.com")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "verify_user_btn"))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "password"))).send_keys("mypassword")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "btnSubmit"))).click()

iframe 标签指定内联框架;它用于在当前 HTML 文档中嵌入另一个文档。

在对 iframe 内的元素进行操作之前,我们必须使用

切换到它
driver.switch_to.frame(iframe reference)

在这种情况下,iframe 是

<iframe frameborder="0" hspace="0" scrolling="no" src="/GBS/Authentication/Authenticate?redirectUrl=%2FGBS%2FProject&amp;requestMode=Setup&amp;isIframe=True" allowtransparency="true" style="border: none; width: 345px; height: 513px;"></iframe>

所以我们要找到iframe的引用,并使用引用切换到iframe。

iframe = driver.find_element_by_xpath("//div[@id='oxygen-container']/iframe")
driver.switch_to.frame(iframe)

注意:iframe引用参数可以是任何可以找到iframe的定位器机制。然后输入用户名和密码。

username_field = driver.find_element_by_id("userName")
username_field.send_keys("test@mail.com")

driver.find_element_by_id("verify_user_btn").click()

password = driver.find_element_by_id("password")
password.send_keys("mypassword")

完成与 iframe 内感兴趣元素的所有交互后,切换回默认内容。也就是说,从iframe中走出来。

driver.switch_to.default_content()

您可能必须添加适当的等待时间才能加载元素(包括 iframe)。