【问题标题】:How to re-load page while looping over elements?如何在循环元素时重新加载页面?
【发布时间】:2022-01-05 04:43:21
【问题描述】:

这是我的代码,应该很容易重新创建:

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options


def main():
    # Setup chrome options
    chrome_options = Options()
    chrome_options.add_argument("--headless")  # Ensure GUI is off
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--window-size=1920x3500")

    # Set path to chromedriver as per your configuration
    webdriver_service = Service("/home/sumant/chromedriver/stable/chromedriver")

    # Choose Chrome Browser
    driver = webdriver.Chrome(service=webdriver_service, options=chrome_options)
    driver.maximize_window()

    # Get page
    url =  "https://www.ibrance.com/"
    driver.get(url)
    time.sleep(2)
    ele = driver.find_elements_by_tag_name('a')
    for i, e in enumerate(ele):
        try:
            print(e.get_attribute('outerHTML'))
            e.click()
            time.sleep(2)
            driver.save_screenshot(f"/mnt/d/Work/ss{i}.png")
            driver.get(url)
            # driver.refresh()
        except:
            print("element not interactable")
    
    driver.close()
    driver.quit()

if __name__ == '__main__':
    main()

这个想法是我点击一个链接截图,再次加载主页,点击下一个链接等等。 在第一个链接之后,它无法在重新加载的页面上找到任何其他元素。

【问题讨论】:

    标签: python python-3.x selenium


    【解决方案1】:

    这是正确的,因为刷新后它无法找到您需要的元素。 为此,需要在每次刷新后重新加载元素。 这样做:

    ele = driver.find_elements_by_tag_name('a')
    for i, e in enumerate(ele):
        try:
            print(e.get_attribute('outerHTML'))
            e.click()
            time.sleep(2)
            driver.save_screenshot(f"/mnt/d/Work/ss{i}.png")
            driver.get(url)
            driver.refresh()
            # reload elements
            ele = driver.find_elements_by_tag_name('a')
    

    【讨论】:

    • 抛出以下错误:Message: stale element reference: element is not attached to the page document
    • 尝试删除刷新,这是多余的。
    • ele = driver.find_elements_by_tag_name('a') for i range(len(ele)): ele = driver.find_elements_by_tag_name('a') for a in range(1): try: print( ele[i].get_attribute('outerHTML')) ele[i].click() time.sleep(2) driver.save_screenshot(f"/mnt/d/Work/ss{i}.png") driver.get (url) driver.refresh() 中断
    • 但是这只会得到第一个屏幕截图然后停止(如果你添加一个中断)。我想在单击每个元素后获取屏幕截图,因此是循环。
    • 不,这应该为您提供完整的屏幕截图。中断仅在第一个循环中,它会将您返回到第一个循环
    【解决方案2】:

    所以这行得通 (感谢 YuMa 的启发)

    def main():
    # ...
    
    
    # Get page
        url =  "https://www.ibrance.com/"
        driver.get(url)
        time.sleep(2)
        total_element = driver.find_elements_by_tag_name('a')
        total_clicks = len(total_element)
    
    
        def get_images(ele, i):
            try:
                ele[i].click()
                time.sleep(2)
                # driver.save_screenshot(f"/mnt/d/Work/ss{i}.png")
                print(driver.title)
                driver.get(url)
                time.sleep(2)
            except:
                print("")
        
    
        for i in range(0, total_clicks+1):
            ele = driver.find_elements_by_tag_name('a')
            get_images(ele, i)
    

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 2011-07-21
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多