Python 调用driver.refresh()后,WebElement将作为非类型返回
我正在用Python编写一个脚本,在一个社交网络上进行冒烟测试,它实现了一个post提要 我编写了一个方法来查找最上面的帖子,并返回它(它是类“media”)。您将看到有一些时间.sleep()和refresh()调用,这是因为我们使用的服务器非常糟糕,至少可以这么说,而且加载经常失败,只呈现部分内容,因此需要刷新 这里的问题是:当且仅当调用br.refresh()时,返回的对象是NoneType。如果页面加载正确,并且未调用refresh(),则返回的对象是正确的 有人知道为什么会这样吗?我尝试在不使用异常的情况下实现该方法(如果这是导致返回失败的原因),但没有成功 PS:奇怪的是,如果我没有等待br.refresh()被调用,而是手动去按“受驱动”浏览器上的刷新按钮,那么对象将完美地返回 代码如下:Python 调用driver.refresh()后,WebElement将作为非类型返回,python,selenium,webdriver,Python,Selenium,Webdriver,我正在用Python编写一个脚本,在一个社交网络上进行冒烟测试,它实现了一个post提要 我编写了一个方法来查找最上面的帖子,并返回它(它是类“media”)。您将看到有一些时间.sleep()和refresh()调用,这是因为我们使用的服务器非常糟糕,至少可以这么说,而且加载经常失败,只呈现部分内容,因此需要刷新 这里的问题是:当且仅当调用br.refresh()时,返回的对象是NoneType。如果页面加载正确,并且未调用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!我根本没想到!而且,它确实有效!非常感谢你的帮助!