1

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

我写了一个方法来查找最上面的帖子,然后返回它(它是“媒体”类)。你会看到有一些 time.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)

以及尝试读取返回的对象时出现的错误:

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'
4

1 回答 1

4

refresh()重新加载浏览器页面。之后,所有WebElements 都无效,您必须重新定位它们。

背景:Selenium / WebDriver 不记得你是如何获得元素的,它们会向浏览器询问元素的唯一内部 ID,当你点击一个元素时,它们会向浏览器发送一条消息“点击 34987563424563.34675” .

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

之所以进入断言是因为子句(最后一行)None中没有return声明。except如果没有明确的return,所有 Python 函数都会返回None. 尝试return getLastPost(br, count)

于 2013-08-13T14:20:47.203 回答