Python with Selenium:是否可以刷新框架而不是整个页面?

Ser*_*aph 6 python iframe selenium

如果 selenium 无法刷新框架,我正在处理具有嵌套框架的网页。结构基本上是: webpage -> frame A -> frame B -> frame C我需要不断刷新帧C。我想知道硒是否可以实现这一点。据我测试,该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")))
Run Code Online (Sandbox Code Playgroud)

如果硒不能刷新帧,我想知道是否有更好的方法在帧 B 和 C 之间切换?我真的不想一次又一次地转到默认内容和框架A...我觉得应该有一种方法可以保留框架B和框架C的Web元素。但我不知道该怎么做。非常感谢!

Mat*_*ati 1

实际上可以,至少使用最新版本的 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)
Run Code Online (Sandbox Code Playgroud)

我已经用一堆本地 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>
Run Code Online (Sandbox Code Playgroud)
<!-- 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>
Run Code Online (Sandbox Code Playgroud)
<!-- 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>
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,每个“Time”标签后面都跟着一个单页加载时的时间戳,下图就更清楚了,你可以看到每个“Time”都加载了一次,除了内部的FrameC从实际网站加载更新的时间戳。

在此输入图像描述