Python 调用driver.refresh()后,WebElement将作为非类型返回

Python 调用driver.refresh()后,WebElement将作为非类型返回,python,selenium,webdriver,Python,Selenium,Webdriver,我正在用Python编写一个脚本,在一个社交网络上进行冒烟测试,它实现了一个post提要 我编写了一个方法来查找最上面的帖子,并返回它(它是类“media”)。您将看到有一些时间.sleep()和refresh()调用,这是因为我们使用的服务器非常糟糕,至少可以这么说,而且加载经常失败,只呈现部分内容,因此需要刷新 这里的问题是:当且仅当调用br.refresh()时,返回的对象是NoneType。如果页面加载正确,并且未调用refresh(),则返回的对象是正确的 有人知道为什么会这样吗?我尝

我正在用Python编写一个脚本,在一个社交网络上进行冒烟测试,它实现了一个post提要

我编写了一个方法来查找最上面的帖子,并返回它(它是类“media”)。您将看到有一些时间.sleep()和refresh()调用,这是因为我们使用的服务器非常糟糕,至少可以这么说,而且加载经常失败,只呈现部分内容,因此需要刷新

这里的问题是:当且仅当调用br.refresh()时,返回的对象是NoneType。如果页面加载正确,并且未调用refresh(),则返回的对象是正确的

有人知道为什么会这样吗?我尝试在不使用异常的情况下实现该方法(如果这是导致返回失败的原因),但没有成功

PS:奇怪的是,如果我没有等待br.refresh()被调用,而是手动去按“受驱动”浏览器上的刷新按钮,那么对象将完美地返回

代码如下:

def getLastPost (br, count = 0):

    try:
        elapsed = 0
        while(br.find_elements_by_class_name("media") == []) and elapsed < 15:
            if elapsed % 5 == 0:
                log("Waiting...","w")
            time.sleep(0.5)
            elapsed += 0.5
        if(br.find_elements_by_class_name("media") == []):
            raise NoSuchElementException
        return br.find_elements_by_class_name("media")[0]

    except NoSuchElementException:
        if(count >= 5):
            raise Exception("Element not found after 5 page reloads.")
        log("Element not loaded! Retrying.","w")
        count += 1
        br.refresh()
        time.sleep(count)  # Wait a bit more each time.
        getLastPost(br, count)
def getLastPost(br,计数=0): 尝试: 已用时间=0 而(br.通过类名称(“媒体”)==[])查找元素,并且经过<15: 如果经过%5==0: 日志(“等待…”,“w”) 睡眠时间(0.5) 运行时间+=0.5 如果(br.通过类名称(“媒体”)查找元素)=[]: 提出无接触异常 返回br.按类别名称(“媒体”)查找元素[0] 除无任何例外: 如果(计数>=5): 引发异常(“重新加载5页后未找到元素”) 日志(“元素未加载!正在重试。”,“w”) 计数+=1 br.refresh() 时间。睡眠(计数)#每次多等一点。 getLastPost(br,计数) 以及尝试读取返回对象时出现的错误:

Traceback (most recent call last):
  File "Smoke.py", line 37, in <module>
    assert ("MESSAGE") in getLastPost(br).text
AttributeError: 'NoneType' object has no attribute 'text'
回溯(最近一次呼叫最后一次):
文件“Smoke.py”,第37行,在
在getLastPost(br.text)中断言(“消息”)
AttributeError:“非类型”对象没有属性“文本”
刷新()
重新加载浏览器页面。之后,所有
WebElement
s都无效,您必须再次找到它们

背景:Selenium/WebDriver不记得您是如何获得元素的,他们要求浏览器提供元素的唯一内部ID,当您(比如)单击元素时,他们会向浏览器发送一条消息“click on 34987563424563.34675”

重新加载将使所有内部ID无效

在断言中获得
None
的原因是
子句(最后一行)中没有
return
语句。如果没有显式的
返回
,所有Python函数都返回
None
。尝试
返回getLastPost(br,count)
刷新()
重新加载浏览器页面。之后,所有
WebElement
s都无效,您必须再次找到它们

背景:Selenium/WebDriver不记得您是如何获得元素的,他们要求浏览器提供元素的唯一内部ID,当您(比如)单击元素时,他们会向浏览器发送一条消息“click on 34987563424563.34675”

重新加载将使所有内部ID无效


在断言中获得
None
的原因是
子句(最后一行)中没有
return
语句。如果没有显式的
返回
,所有Python函数都返回
None
。尝试
返回getLastPost(br,count)

我理解这一点,但在刷新之后,我调用find\u元素。。。同样,它会找到它并返回它,就像它是一个有效的WebElement一样。如果它是一个过时的元素,那么错误不应该在返回它并尝试读取它之前出现,而不是在返回它并尝试读取它之后出现吗?既然在“刷新”和“尝试读取它”之间没有使用
br
,那么到底是什么触发了错误?你是对的,我表达的完全错误。我的疑问主要是,为什么它会触发一个“非类型”错误而不是一个过时的元素?当尝试读取文本属性时,而不是“嘿,您正在读取一个'void'对象”时,是否应该出现该错误?非常感谢你的耐心!啊,那是因为除了
子句(最后一行),在
中没有
return
语句。如果没有显式的
返回
,所有Python函数都返回
None
。尝试返回getLastPost(br,count)
AHA!我根本没想到!而且,它确实有效!非常感谢你的帮助!我明白,但在刷新之后,我调用find_元素。。。同样,它会找到它并返回它,就像它是一个有效的WebElement一样。如果它是一个过时的元素,那么错误不应该在返回它并尝试读取它之前出现,而不是在返回它并尝试读取它之后出现吗?既然在“刷新”和“尝试读取它”之间没有使用
br
,那么到底是什么触发了错误?你是对的,我表达的完全错误。我的疑问主要是,为什么它会触发一个“非类型”错误而不是一个过时的元素?当尝试读取文本属性时,而不是“嘿,您正在读取一个'void'对象”时,是否应该出现该错误?非常感谢你的耐心!啊,那是因为除了
子句(最后一行),在
中没有
return
语句。如果没有显式的
返回
,所有Python函数都返回
None
。尝试返回getLastPost(br,count)
AHA!我根本没想到!而且,它确实有效!非常感谢你的帮助!