【问题标题】:trouble executing Selenium python unittests in C# with ScriptEngine (.NET 3.5)使用 ScriptEngine (.NET 3.5) 在 C# 中执行 Selenium python 单元测试时遇到问题
【发布时间】:2011-04-14 05:37:37
【问题描述】:

第一次海报。

我正在转向关于堆栈溢出的第一个问题,因为我在尝试找到答案时发现的资源很少。我正在寻找从 C# 应用程序执行 Selenium python 测试。我不想每次都编译 C# Selenium 测试;我想利用 IronPython 脚本进行动态硒测试。 (注意:我很少有 Python 或 ScriptEngine 等方面的经验。)

Selenium 以以下形式在 python 中输出单元测试:

from selenium import selenium
import unittest

class TestBlah(unittest.TestCase):
    def setUp(self):
        self.selenium = selenium(...)
        self.selenium.start()

    def test_blah(self):
        sel = self.selenium
        sel.open("http://www.google.com/webhp")
        sel.type("q", "hello world")
        sel.click("btnG")
        sel.wait_for_page_to_load(5000)
        self.assertEqual("hello world - Google Search", sel.get_title())
        print "done"

    def tearDown(self):
        self.selenium.stop()

if __name__ == "__main__":
    unittest.main()

我可以使用 ipy.exe 从命令行运行它,没问题:

ipy test_google.py

我可以看到 Selenium Server 启动了一个 firefox 浏览器实例并运行测试。

我无法使用 C#、.NET 3.5 中的 ScriptEngine 等 API 获得相同的结果,我认为它的中心是无法执行 main() 函数我猜下面的代码是:

if __name__ == "__main__":
    unittest.main()

我尝试过 engine.ExecuteFile()、engine.CreateScriptSourceFromString()/source.Execute() 和 engine.CreateScriptSourceFromFile()/source.Execute()。我试过 scope.SetVariable("__name__", "__main__")。当我注释掉 py 文件的 if __name__ 部分并在对 py 文件调用 engine.Runtime.ExecuteFile() 之后调用 engine.CreateScriptSourceFromString("unittest.main(module=None") 时,我确实取得了一些成功。我尝试将结果存储在 python 中并通过 scope.GetVariable() 访问它们。我还尝试编写一个 python 函数,我可以从 C# 调用来执行单元测试。

(engine是ScriptEngine的实例,source是ScriptSource的实例等)

我对 Python、ScriptEngine 或 unittest 模块的无知很容易导致我遇到麻烦。有没有人在 C# 中使用 ScriptEngine 等 API 执行 python 单元测试?有没有人从 ScriptEngine 成功执行“主要”代码?

另外,我读到 unittest 有一个测试运行器,可以帮助通过 TestResult 对象访问错误。我相信语法如下。我还没到这里,但知道我需要收获结果。

unittest.TextTestRunner(verbosity=2).run(unittest.main())

提前致谢。我认为最好有更多的细节而不是更少。 =P

【问题讨论】:

    标签: c# unit-testing selenium ironpython


    【解决方案1】:

    查看 IronPython 控制台 (ipy.exe) 的 source code,看起来它最终归结为调用 ScriptSource.ExecuteProgram()。您可以从各种ScriptEngine.CreateScriptSourceFrom* 方法中的任何一种获取ScriptSource

    例如:

    import clr
    clr.AddReference("IronPython")
    
    from IronPython.Hosting import Python
    engine = Python.CreateEngine()
    src = engine.CreateScriptSourceFromString("""
    if __name__ == "__main__":
        print "this is __main__"
    """)
    
    src.ExecuteProgram()
    

    运行它将打印“这是ma​​in”。

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      unittest.main(module=__name__)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-08
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多