我正在用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'
答案 0 :(得分:3)
refresh()
重新加载浏览器页面。之后,所有WebElement
都无效,您必须再次找到它们。
背景:Selenium / WebDriver不记得你是如何得到这个元素的,他们向浏览器询问元素的唯一内部ID,当你点击一个元素时,他们会向浏览器发送一条消息“点击在34987563424563.34675“。
重新加载会使所有内部ID无效。
你在断言中得到None
的原因是因为return
子句中没有except
语句(最后一行)。没有明确的return
,所有Python函数都返回None
。试试return getLastPost(br, count)