在 Streamlit 上的 iframe 上使用 selenium 时打开了两个浏览器页面
Posted
技术标签:
【中文标题】在 Streamlit 上的 iframe 上使用 selenium 时打开了两个浏览器页面【英文标题】:Two browser pages opened when using selenium on iframe on Streamlit 【发布时间】:2022-01-14 15:11:25 【问题描述】:我无法在 streamlit 的 iframe 页面上执行 selenium 代码。当我通过在 cmd 上执行 streamlit run app5.py 来运行 .py 文件时,它会生成两个浏览器,其中一个是 streamlit 应用程序 (localhost:8501),另一个是带有警报的空页面顶部的消息显示“Chrome 正在由自动测试软件控制”。我对 selenium 代码未运行的原因的猜测是因为它在空页面而不是 streamlit 页面上执行 selenium。有没有办法删除或不填充空白页面?
这是我的代码:
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)
components.iframe("https://wego.here.com/", height = 500)
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)
下面是我在cmd上执行streamlit run app5.py时两个页面的截图(最近生成的是空页面):
【问题讨论】:
Selenium 总是运行没有profile
、cookies
等的新浏览器,并且它不使用已经打开的浏览器。 streamlit
总是使用默认浏览器运行代码,如果它已经打开,那么它会在这个窗口中运行。所以两者都使用不同的策略来运行浏览器,你会得到两个窗口。也许在 selenium 中你应该运行 driver.get("http://localhost:8501")
我不确定两者是否可以同时运行。也许selenium
将不得不在单独的线程中运行。当我使用driver.get()
运行代码时,它会打开许多窗口。似乎 steamlit 在某个循环中运行代码以定期更新数据。
【参考方案1】:
无头运行 selenium。
代码:
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
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(options=chrome_options)
wait = WebDriverWait(driver, 20)
components.iframe("https://wego.here.com/", height = 500)
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)
【讨论】:
【参考方案2】:您可以使用 window_handles 和 switch_to_window 方法来做到这一点。
点击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)
#Switch to the other window
window_before = driver.window_handles[0]
driver.switch_to_window(window_before)
components.iframe("https://wego.here.com/", height = 500)
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)
【讨论】:
以上是关于在 Streamlit 上的 iframe 上使用 selenium 时打开了两个浏览器页面的主要内容,如果未能解决你的问题,请参考以下文章
在 iframe 中使用 Selenium:NoSuchElementException
打包 streamlit 应用并在 Windows 上运行可执行文件
Windows 7 64 位上的 streamlit 安装错误