Python 机器人框架扩展Selenium以处理加载元素
我正在使用Robot框架进行测试自动化,我想知道是否有一种方法可以扩展Selenium Webdriver来处理加载元素。作为参考,当我说加载元素时,我指的是自定义角度元素 我知道我可以做一个Python 机器人框架扩展Selenium以处理加载元素,python,selenium,automation,frameworks,robotframework,Python,Selenium,Automation,Frameworks,Robotframework,我正在使用Robot框架进行测试自动化,我想知道是否有一种方法可以扩展Selenium Webdriver来处理加载元素。作为参考,当我说加载元素时,我指的是自定义角度元素 我知道我可以做一个等待直到元素不可见,但我真正想做的是在Selenium Webdriver上创建一个常量侦听器,以便在该加载元素可见时停止。我不想经常使用robot关键字来检查元素是否可见,而被迫实现任意的ish睡眠 如果我的问题仍然不清楚,下面是我想到的一些伪代码/伪流。我假设Selenium是单线程的,否则这个想法将是
等待直到元素不可见
,但我真正想做的是在Selenium Webdriver上创建一个常量侦听器,以便在该加载元素可见时停止。我不想经常使用robot关键字来检查元素是否可见,而被迫实现任意的ish睡眠
如果我的问题仍然不清楚,下面是我想到的一些伪代码/伪流。我假设Selenium是单线程的,否则这个想法将是徒劳的
Selenium Webdriver:
AddListener(new LoadingListener)
LoadingListener
While ( LoadingElement is Visible)
Sleep 1s
请回复任何反馈。如果这不可能,请告诉我,如果您有任何想法,也请告诉我。我从未这样做过,但您可以使用侦听器接口在每个关键字之前或之后调用函数。例如,侦听器可能看起来像这样(未测试): 如果元素在当前页面上不存在,这可能会引发异常,并且您还需要添加代码来处理在浏览器打开之前运行关键字的情况,但希望它能给出一般思路
有关侦听器接口的更多信息,请参阅中标题为的部分 另一个方向是使用关键字
executeasyncjavascript
该文件指出:
执行异步JavaScript代码
与执行Javascript类似,不同之处在于使用
关键字必须通过调用
提供了回调。此回调始终被注入已执行的
函数作为最后一个参数
脚本必须在脚本超时内完成,否则此关键字将被删除
失败
使用文档中的以下代码示例:
${result} = Execute Async JavaScript
... var callback = arguments[arguments.length - 1];
... function answer(){callback("text");};
... window.setTimeout(answer, 2000);
Should Be Equal ${result} text
下面是我最终使用的解决方案:) 工作顺利,谢谢大家的评论和帮助
from robot.libraries.BuiltIn import BuiltIn
from datetime import datetime
class LoaderListener(object):
ROBOT_LISTENER_API_VERSION = 2
ROBOT_LIBRARY_SCOPE = "GLOBAL"
def __init__(self):
self.ROBOT_LIBRARY_LISTENER = self
self.selib = BuiltIn().get_library_instance("SeleniumLibrary")
def _start_suite(self, name, attrs):
BuiltIn().log_to_console("Loader Listener Has Been Attached.")
def start_keyword(self, name, attrs):
try:
# If this doesn't fail we have the loader
self.selib.find_element("id=loader")
# Take time stamp for when we begin waiting
BuiltIn().log_to_console("The Page Is Loading.")
start_time = datetime.now()
# Wait Until Element Not Visible
# Sometimes this will fail, because by the time we get here the loader is gone.
# In that case, just continue as normal
try:
self.selib.wait_until_element_is_not_visible("id=loader")
except:
pass
# Take time stamp for when we have stopped waiting
end_time = datetime.now()
# Calculate time elapsed
elapsed_time = (end_time-start_time)
# Create output message and log to conosle
output_message = "The Page Has Finished Loading in {0}".format(elapsed_time)
BuiltIn().log_to_console(output_message)
except:
# We don't have the element...
pass
这个“加载元素”是静态的吗(即:有一个一致的id,或者可以通过一个在测试生命周期内保持不变的xpath引用)?是的,我可以使用一个常量xpath
from robot.libraries.BuiltIn import BuiltIn
from datetime import datetime
class LoaderListener(object):
ROBOT_LISTENER_API_VERSION = 2
ROBOT_LIBRARY_SCOPE = "GLOBAL"
def __init__(self):
self.ROBOT_LIBRARY_LISTENER = self
self.selib = BuiltIn().get_library_instance("SeleniumLibrary")
def _start_suite(self, name, attrs):
BuiltIn().log_to_console("Loader Listener Has Been Attached.")
def start_keyword(self, name, attrs):
try:
# If this doesn't fail we have the loader
self.selib.find_element("id=loader")
# Take time stamp for when we begin waiting
BuiltIn().log_to_console("The Page Is Loading.")
start_time = datetime.now()
# Wait Until Element Not Visible
# Sometimes this will fail, because by the time we get here the loader is gone.
# In that case, just continue as normal
try:
self.selib.wait_until_element_is_not_visible("id=loader")
except:
pass
# Take time stamp for when we have stopped waiting
end_time = datetime.now()
# Calculate time elapsed
elapsed_time = (end_time-start_time)
# Create output message and log to conosle
output_message = "The Page Has Finished Loading in {0}".format(elapsed_time)
BuiltIn().log_to_console(output_message)
except:
# We don't have the element...
pass