Python 等待文档在 selenium 浏览器中准备好?

Python wait for document to be ready in selenium browser?

我在 python 中结合 selenium 制作了一个代理检查器,因此每次打开 selenium 浏览器时它都会使用不同的代理。但并非所有代理都有效,我无法加载页面如果代理速度慢,则永远。因此,字符串作为键不起作用,因为页面未加载。 Python 中是否有一个函数可以让我做一些事情,例如当页面在 10 秒内未完全加载时它应该转到下一个代理?提前致谢!

到目前为止我的代码:

# PROXY SETUP FOR THIS PROGRAM
def fly_setup(fly_url):
    fly_options = webdriver.ChromeOptions()
    fly_options.add_experimental_option("prefs", {
        "profile.default_content_setting_values.notifications": 1
    })
    with open("proxies.txt") as fly_proxies:
        lines = fly_proxies.readlines()
        counter = 0

        for proxy in lines:
            fly_options.add_argument('--proxy-server=%s' % proxy.rstrip())
            ad_chrome = webdriver.Chrome(options=fly_options)
            ad_chrome.get(fly_url)
            ad_source = ad_chrome.page_source
            key = 'Vind ik leuk'
            time.sleep(10)
            if ad_chrome.set_page_load_timeout(10):
                print("Page load took to long.. Going to next proxy ")
            else:
                if key not in ad_source:
                    print("Proxy not working! Going to next one ...")
                    ad_chrome.quit()
                    time.sleep(3)
                else:
                    time.sleep(10)
                    ad_chrome.find_element_by_xpath('//*[@id="skip_bu2tton"]').click()
                    counter += 1
                    print("Total views : " + str(counter))
                    print("")
                    ad_chrome.quit()
                    time.sleep(3)

您可以使用 set_page_load_timeout 设置超时限制,例如

driver.set_page_load_timeout(10)

如果页面无法在 10 秒内加载,那么它将抛出 TimeoutException doc here,捕获它然后切换到下一个代理。

在你的代码中,如果我假设 lines 包含所有代理,你可以这样做:

for proxy in lines:
    fly_options.add_argument('--proxy-server=%s' % proxy.rstrip())
    ad_chrome = webdriver.Chrome(options=fly_options)
    ad_chrome.set_page_load_timeout(10)
    try:
        ad_chrome.get(fly_url)
    except TimeoutException:
        continue

此解决方案并不总是有效,尤其是当页面使用 AJAX 调用加载数据时。在这种情况下,押注 selenium 的 waits,等待整个页面完成加载时只有 presented/clickable 的东西,然后同样的想法,捕获 TimeoutException 并继续循环。