当前位置: 首页 > 知识库问答 >
问题:

在iframe中使用Selenium:NoSuchElementException

楚岳
2023-03-14

我正在运行一个流媒体应用程序,在其中我尝试在iframe组件中运行selenium(单击搜索框并),但我一直收到错误“NoSuchElementException”。

它成功地打开了流媒体应用html" target="_blank">程序上的iframe,但它不执行iframe内的selenium代码。当我在没有iframe的情况下测试它时,selenium代码本身运行良好,但我无法让它在iframe内工作。

以下是我的代码:

import streamlit as st
from dateutil.parser import parse
import streamlit.components.v1 as components
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

st.title("Auto Search App")

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)

# url = 'https://wego.here.com/'
# driver.get(url)

components.iframe("https://wego.here.com/", height = 500)

## Give time for iframe to load ##
time.sleep(3)
## You have to switch to the iframe like so: ##
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))

search_input = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input.input_search")))
search_input.click()
search_input.send_keys('Seattle')
search_input.send_keys(Keys.ENTER)

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "button.btn"))).send_keys(Keys.ENTER)

internal_search_input = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input#itinerary_item_input_0")))
internal_search_input.click()
internal_search_input.send_keys('Chicago')
internal_search_input.send_keys(Keys.ENTER)

这是带有错误消息的流光页面:

编辑:根据答案,我想我不必切换到iframe才能访问搜索输入元素。我猜问题是由于当我在cmd上运行“stream light runapp5.py”时,它会生成两个单独的浏览器,最近打开了一个空浏览器,因此selenium代码在一个空页面上执行,而不是在stream lightlocalhost:8501页面上。我怎么能不生成空浏览器而只打开localhost:8501页面,这样selenium代码就会在stream light页面上运行呢?

EDIT2:我添加了更多的selenium执行代码供您参考。我在这里使用selenium的原因是为了在iframe上实现一些自动化,以便它在最后填充导航页面。我可以通过使用< code>driver.get(url)在单独的chrome上完成这项工作,但不能在带有iframe的streamlit上完成。这是我希望在iframe中看到的最终结果:

共有3个答案

邓卓
2023-03-14

您需要在这里考虑几件事。

> < li>

所需的< code >

要在任何可点击的元素上点击(),而不是在presence_of_element_located()上点击,您需要为element_to_be_clickable()引入WebDriverWait,并且您可以使用以下定位器策略:

代码块:

driver.get("https://wego.here.com/")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.input_search"))).send_keys("Seattle" + Keys.RETURN)

浏览器快照:

司空俊雄
2023-03-14

输入。input_search元素不在该页面的任何iframe中
其中有4个iframe,但搜索输入不在任何iframe中
因此,您不应切换到iframe以访问搜索输入元素

周麒
2023-03-14

从您的代码中,我知道您正在尝试运行硒代码以在打开的Streamlit页面内的iframe中设置输入的值。

这是不可能的。当您运行此代码时,我将尝试使用事件顺序进行解释。

对于您当前的代码,这是所发生的事情:

  1. 您运行流光运行 app.py 命令。
  2. 流光在浏览器浏览器中打开此代码。
  3. 硒代码开始运行,因为你不使用driver.get(url),所以它在一个空页面上运行,导致无SuchElement例外。

如果使用<code>驱动程序。获取(url)并将url设置为Streamlit应用程序url=http://localhost:8501/“那幺它也不会工作,因为会发生以下情况:

    < li >您运行< code>streamlit run app.py命令。 < li>Streamlit在chrome浏览器中打开此代码。 < Li > selenium代码开始运行,并打开selenium代码的一个新的chrome标签,您不能让selenium获得一个已经打开的标签(会话)。

我建议不要使用selenium,而是使用Streamlit创建一个text_input,并使用输入的地理位置生成iframe。

法典:

import streamlit as st
import streamlit.components.v1 as components
from geopy.geocoders import Nominatim

bt = st.text_input("Enter Location")

if bt:
    geolocator = Nominatim(user_agent="my_app")
    location = geolocator.geocode("Seattle")
    components.iframe(f"https://wego.here.com/?map={location.latitude},{location.longitude},18,normal&x=ep", height = 500)

输出:

编辑1 -如果你只想查看从芝加哥到西雅图的方向,只需更改url即可。

代码:

import streamlit as st
import streamlit.components.v1 as components
from geopy.geocoders import Nominatim

components.iframe("https://wego.here.com/directions/mix/Chicago/Seattlel", height = 500)

输出:

 类似资料:
  • 问题内容: 我有这样的 我想引用元素“ x”。我尝试了几种方法,但找不到解决方案。 问题答案: document.getElementById(‘myframe1’).contentWindow.document.getElementById(‘x’) 所有浏览器(包括较旧版本的IE)都支持该功能。 请注意,如果的是从另一个域,您将无法访问其内容,由于同源策略。

  • 问题内容: 我想创建一个Selenium测试,以使用AOL邮件测试我们的扩展。我设法登录到AOL并撰写了电子邮件,但是我还需要在iframe中的编辑器中选择元素。我检查了一下,即使打开了编辑器,以下测试也失败了: 我得到了错误。如何通过Xpath(或通过Selenium以任何其他方式)选择iframe的主体和其他元素? 问题答案: 在切换到之前,您无法浏览。您的xPath 将不会起作用,因为代码位

  • 问题内容: 我在从父页面调用JavaScript函数时遇到问题。这是我的两页: mainPage.html resultFrame.html (我知道不建议这样做,但只能在内部使用IE浏览此页面,我不认为这是问题所在) 当我按下“重置”按钮时,我得到“找到resultFrame”和“找不到resultFrame.Reset”。似乎有对框架的引用,但无法在框架上调用该函数,为什么呢? 问题答案: 采

  • 问题内容: 我无法处理包含IE8 pdf文件的。它可以与谷歌浏览器一起使用。 HTML CSS 问题答案: 有一种方法可以用其他元素覆盖IE中的窗口元素,但是您不会喜欢它。 背景:开窗和无窗元素 旧版IE将元素分为两种类型:窗口化和无窗口化。 像普通的元素,并有 窗户 。它们由浏览器本身在单个MSHTML平面中呈现,并且相互尊重z轴的顺序。 在MSHTML外部呈现的元素带有 窗口;例如(由OS渲染

  • 问题内容: 我有这样的html结构。我想获取没有类或ID的第二张表。我如何从中获得第二张桌子? 我正在尝试这样 谁能帮我? 问题答案: 您想遍历元素吗?最好从像 您只能这样做。

  • 我尝试了xpath和检查,如下所示