python+selenium:利用WebDriverWait实现多条件等待

       WebDriverWait类结合其until或者not_until方法可以实现显性等待,即通过until或者not_until的method参数把外部callable的函数或者实例传给WebDriverWait,然后进行判断。该方法通常会结合expected_conditions模块使用,该模块提供了很多的判断页面元素各种状态的类以及方法,因此两者结合可以实现很多的需求。但是这里有一个问题就是,如何只是单纯的和expected_conditiond结合,只能一次实现一个给定条件的判断,如果我们有多个条件需要判断,则应该如何实现呢?

       其实很简单,只需要自己构造一个callable的类或者函数就行,我们可以把多个条件打包进行这个类的__call__函数中或者callable的函数中,然后如果满足条件,则返回True,不满足则返回False即可。如下代码所示,目的是:当网页出现了alert弹窗或者出现了“提示重新登录”的窗口,则关闭页面。这里通过构造了一个callable的类alert_or_relogin来实现这样的条件,然后再把这个类传给until()即可。这里需要注意的一点是,alert_or_relogin中对于两个条件的判断是依次分开判断的,先判断是否出现alert弹窗,如果没有再判断是否需要重新登录,这样做的原因是一旦出现alert弹窗,则页面就会被锁定,driver也就不能再获取页面其他的元素,所以此时如果再强制driver获取判断是否需要重新登录,则会报错。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

#import time

class alert_or_relogin:
    def __call__(self,driver):
        '''用来结合webDriverWait判断是否出现alert或者需要重新登陆'''
        is_alert=bool(EC.alert_is_present()(driver))
        if is_alert:
            return True
        else:
            is_invisible=EC.invisibility_of_element_located((By.XPATH,'//*[@id="repeatcourseDialog"]/div/div[3]/a'))(driver)
            is_visible=not bool(is_invisible)
            if is_visible:
                return True
            else: return False

driver=webdriver.Chrome()
driver.get('url')
WebDriverWait(driver,timeout=60,poll_frequency=5).until(alert_or_relogin())
driver.close()

 

你可能感兴趣的:(selenium,python网络爬虫,python编程)