如果selenium不能刷新框架,我正在处理一个具有嵌套框架的网页。其结构基本上是:webpage -> frame A -> frame B -> frame C,我需要不断刷新框架C。我想知道selenium是否能做到这一点。就我所能测试的范围而言,refresh()函数刷新整个页面。
恼人的部分是,唯一可以刷新框架C的按钮位于框架B上,因此目前我必须执行以下循环:
while True:
browser.switch_to_default_content()
WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it(("frame A")))
WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it(("frame B")))
browser.find_element_by_css_selector("refresh_button").click()
WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it(("frame C")))如果selenium不能刷新框架,我想知道是否有更好的方法在框架B和C之间切换?我真的不想一次又一次地去默认内容和帧A.我觉得应该有一种方法来保存框架B和框架C的web元素,但我不知道如何做到。非常感谢!
发布于 2021-01-29 21:20:20
实际上是可以的,至少使用最近版本的Selenium。
这是我的代码:
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.common.by import By
import time
import pathlib
# For testing purpose I've created a local HTML page
path = pathlib.Path(__file__).parent.absolute()
url = 'file:///%s/main.html' % path
browser = webdriver.Chrome(executable_path=r"chromedriver.exe")
browser.get(url)
w = WebDriverWait(browser, 5)
# Switch to Frame A
w.until(EC.frame_to_be_available_and_switch_to_it(("frameA")))
# Switch to Frame B
w.until(EC.frame_to_be_available_and_switch_to_it(("frameB")))
# Keep a reference of the refresh button
buttonB = browser.find_element_by_id("refresh")
while True:
# Click the refresh
buttonB.click()
# Wait for frame load and switch to Frame C
w.until(EC.frame_to_be_available_and_switch_to_it(
(By.NAME, "frameC")
))
# Switch back to parent frame aka FrameB
browser.switch_to.parent_frame()
# Testing loop
print('Waiting for commands')
time.sleep(10)我已经用一堆本地html页面测试了代码:
<!-- main.html -->
<h1>MAIN PAGE</h1>
<div id="tick"></div>
<iframe name="frameA" src="frameA.html" width="800" height="600"></iframe>
<script type="text/javascript">
document.getElementById("tick").innerText = "Time: " + new Date().getTime();
</script><!-- frameA.html -->
<h2>FRAME A</h2>
<div id="tick"></div>
<iframe name="frameB" src="frameB.html" width="700" height="500"></iframe>
<script type="text/javascript">
document.getElementById("tick").innerText = "Time: " + new Date().getTime();
</script><!-- frameB.html -->
<h3>FRAME B</h3>
<button id="refresh" onclick="refresh()"></button>
<iframe id="frameC" name="frameC" src="https://currentmillis.com/" width="600" height="400"></iframe>
<script type="text/javascript">
document.getElementById("refresh").innerText = "Time: " + new Date().getTime();
var refresh = function(){
var frameC = document.getElementById('frameC');
frameC.src = frameC.src;
}
</script>正如您所看到的,每个“时间”标签后面都是加载单个页面时的时间戳,下面的图像要清楚得多,您可以看到每个“时间”只加载一次,除了从实际网站加载更新的时间量的内部FrameC外。

https://stackoverflow.com/questions/40189881
复制相似问题