【问题标题】:Python with Selenium: Is it possible to refresh frame instead of the whole page?带有 Selenium 的 Python:是否可以刷新框架而不是整个页面?
【发布时间】:2017-03-04 13:06:41
【问题描述】:

如果 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")))

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

【问题讨论】:

    标签: python selenium iframe


    【解决方案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)
    

    我已经用一堆本地 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2017-12-01
      相关资源
      最近更新 更多