python selenium在网页切换刷新时find_element容易崩溃,怎么解决?

python使用selenium要对网页元素进行判断以确定是不是这个网页再决定是否填入数据,要用到find_element_by_name、find_element_by_class_name等函数,但是在我不停地切换与刷新网页的时候,这两个函数就有一定几率会崩溃,请问怎么解决?

 
def isElementExist(browser, element):
    flag = True
    try:
        browser.find_element_by_css_selector(element)
        return flag
    except:
        flag = False
        return flag

main函数中:
   while True:
        time.sleep(0.1)
        title = isElementExist(browser, 'title')
        if title:
            if browser.find_element_by_class_name("title").text == "交易":
                quote = isElementExist(browser, "[name='quote']")
                if quote:
                    code = browser.find_element_by_name("quote").get_attribute("value")
                    if len(code) == 0:
                          #执行逻辑代码

在main函数中的代码如果网页不刷新不切换的时候是毫无问题的,但是业务就是要求网页需要切换与刷新,这个时候find_element_by_class_name与find_element_by_name就容易崩溃,我还需要加入一个什么机制才能在网页刷新的时候找到元素并操作它保证不崩溃吗?

关键字 :等待

等到元素确实出现在页面中,再进行操作


element = WebDriverWait(driver, 10, 0.1).until(
        lambda browser:browser.find_element_by_name("quote")
 )  # 通过 显式等待,确保元素已经就绪,find成功

code = element.get_attribute("value")   #然后再对元素进行操作

以上代码含义:

  1. 在driver中找元素
  2. 如果失败,每0.1秒重试1次
  3. 最多尝试10秒 (约100次)
  4. 如果成功,把元素赋值给elment

对于题目中的那么多代码,可以使用以下几行代码代替,是不是清爽很多

    my_wait = WebDriverWait(driver, 10, 0.1)   # 定义等待策略,后面会重复用到
    my_wait.until(
        lambda browser: browser.find_element_by_class_name("title").text == "交易"
    )  # 等待 title == 交易,不需要返回值

    element = my_wait.until(
        lambda browser: browser.find_element_by_name("quote")
    )  # 定位元素,需要返回值,返回值就是元素本身

    code = element.get_attribute("value")  # 获取元素属性

在find_element_by_class_name 下面一行 当找到元素 对网页操控前。价格time.sleep(1)。 自然就好了。等他网页动态加载一下就好了

网页每次变化后都把html写入到本地的文本内代码,离线处理本地的文本就好了