Python 机器人框架扩展Selenium以处理加载元素

Python 机器人框架扩展Selenium以处理加载元素,python,selenium,automation,frameworks,robotframework,Python,Selenium,Automation,Frameworks,Robotframework,我正在使用Robot框架进行测试自动化,我想知道是否有一种方法可以扩展Selenium Webdriver来处理加载元素。作为参考,当我说加载元素时,我指的是自定义角度元素 我知道我可以做一个等待直到元素不可见,但我真正想做的是在Selenium Webdriver上创建一个常量侦听器,以便在该加载元素可见时停止。我不想经常使用robot关键字来检查元素是否可见,而被迫实现任意的ish睡眠 如果我的问题仍然不清楚,下面是我想到的一些伪代码/伪流。我假设Selenium是单线程的,否则这个想法将是

我正在使用Robot框架进行测试自动化,我想知道是否有一种方法可以扩展Selenium Webdriver来处理加载元素。作为参考,当我说加载元素时,我指的是自定义角度元素

我知道我可以做一个
等待直到元素不可见
,但我真正想做的是在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