【问题标题】:How to enter text in an iframe with Selenium and Python如何使用 Selenium 和 Python 在 iframe 中输入文本
【发布时间】:2020-11-08 23:48:38
【问题描述】:

我正在尝试将 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 似乎都没有包含 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")

文件“...”,第 17 行,在 username_field = driver.find_element_by_id("userName") selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{“method”:“css selector”,“selector”:“[id="userName"]”} (会话信息:chrome=86.0.4240.183)

【问题讨论】:

    标签: python selenium selenium-webdriver iframe webdriver


    【解决方案1】:

    有一个 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()
    

    【讨论】:

    • 谢谢!等待代码和导入很有帮助,但我仍然收到 NoSuchElementException。我已经更新了上面的代码。还有什么想法吗?
    【解决方案2】:

    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。

    【讨论】:

    • 谢谢,这对澄清我需要做什么非常有帮助。不幸的是,它仍然无法正常工作。我在原始帖子中更新了我的代码。还有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2018-04-19
    • 2021-10-11
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多