Robotframework 如何添加一个使用Sel2Lib的python模块而不会出现多个关键字错误?

Robotframework 如何添加一个使用Sel2Lib的python模块而不会出现多个关键字错误?,robotframework,selenium2library,Robotframework,Selenium2library,我正在尝试导入一个python模块来运行3个多小时,但没有成功。我完成了第四个答案中解释的步骤,其中建议创建python模块Selenium2LibraryExt。 我观察到的问题是,由于我在同一测试的其他代码中使用了Selenim2Library,现在我导入了从Selenim2Library继承的Selenium2LibraryText,我的测试不再知道,例如,单击元素关键字来自Selenim2Library或Selenium2LibraryText,它会给我多个关键字错误 所以我做了 1-

我正在尝试导入一个python模块来运行3个多小时,但没有成功。我完成了第四个答案中解释的步骤,其中建议创建python模块Selenium2LibraryExt。

我观察到的问题是,由于我在同一测试的其他代码中使用了Selenim2Library,现在我导入了从Selenim2Library继承的Selenium2LibraryText,我的测试不再知道,例如,单击元素关键字来自Selenim2Library或Selenium2LibraryText,它会给我多个关键字错误

所以我做了 1-I删除

       from Selenium2Library import Selenium2Library
从python模块的头部开始,但我让它作为一个库留在我的测试用例:设置中

 Library          Selenium2Library  
结果没有成功。然后我就搬走了

Library          Selenium2Library  
从我的测试用例中,添加了:

  from Selenium2Library import Selenium2Library  
在python模块的头部。 但在这两种情况下,我都会出错。我应该如何避免在测试中看到2个Selenium2库


谢谢

,因此您可以通过指定要使用的特定库轻松解决此问题。例如:

Selenium2LibraryExt.Click Element

如果使用继承的库,则测试数据需要导入Selenium2Library或自定义库,但不能同时导入两者。如果仅通过共享资源文件导入,而不是直接在测试中导入,则更易于控制

另一个选项是创建扩展Selenium2Library而不替换它的库:

from robot.libraries.BuiltIn import BuiltIn

class Selenium2LibraryExt(object):

    @property
    def _s2l(self):
        return BuiltIn().get_library_instance('Selenium2Library')

    def get_all_texts(self, locator):
        """Returns the text values of elements identified by `locator`."""
        elements = self._s2l._element_find(locator, False, True)
        return [e.text for e in elements]
如果您使用的是最新版本的Selenium2Library(>=1.7),请获取Webelement并允许您执行许多没有关键字的操作

@{texts}    Create List
@{elems}    Get Webelements    some locator
:FOR    ${elem}    IN    @{elems}
\    ${text}    Get Text    ${elem}
\    Append To List    ${texts}    ${text}
同样的事情,但是使用扩展变量语法来处理文本

或者在Python中:

from robot.libraries.BuiltIn import BuiltIn

class Selenium2LibraryExt(object):

    def get_all_texts(self, locator):
        """Returns the text values of elements identified by `locator`."""
        s2l = BuiltIn().get_library_instance('Selenium2Library')
        elements = s2l.get_webelements(locator)
        # or elements = BuiltIn().run_keyword('Get Webelements', locator)
        return [e.text for e in elements]

另请参见

您的问题与此类似:这并不能解决自定义库和Selenium2库不共享状态(浏览器实例)的问题。谢谢,我从文件中删除了一个Selenium2库,并将自定义库放在我的rf目录中。但它仍然显示了相同的错误。谢谢,我从我的文件中删除了一个Selenium2库,并将我的自定义库放在我的rf目录中。但它仍然显示出同样的错误。然后我决定使用get webelement,但我只是得到了对我没有用的东西。让我解释一下,我有几个小部件头,它们不在列表中,但它们具有相同的html标记。因此,我试图一次获取这些小部件的所有标题。当我使用xpath helper插件并编写xpath helper插件和${webelement}get webelement//div[@class=“rqhdrtitle”]时,它会生成所有标题。但是,当我在Ride中使用${widgets headers}Get Text//div[@class=“rqhdrtitle”]或您所说的${webelement}Get webelement//div[@class=“rqhdrtitle”]执行相同的操作时,我会得到该“”的第一个小部件头。有什么想法吗?请?get webelement仅返回第一个元素。使用GetWebElements。它返回可以代替其他关键字中的定位器使用的对象(添加的示例)。您还可以使用对象的方法或属性,如我的示例中所示。当RF将对象转换为字符串时,是的,您会得到一些没有什么用处的东西。
from robot.libraries.BuiltIn import BuiltIn

class Selenium2LibraryExt(object):

    def get_all_texts(self, locator):
        """Returns the text values of elements identified by `locator`."""
        s2l = BuiltIn().get_library_instance('Selenium2Library')
        elements = s2l.get_webelements(locator)
        # or elements = BuiltIn().run_keyword('Get Webelements', locator)
        return [e.text for e in elements]