我正在构建一个C# WebKit Web浏览器,可以使用IronPython进行自动化,以帮助质量保证测试。我将使用IronPython创建测试计划,运行一些浏览器方法并提供参数,并评估结果。
大部分IronPython的文档都是说明如何使用C#调用IronPython方法,但我已经找出如何设置方法参数并检索方法返回值,但不能在同一个方法中完成。您可以在下面的示例中看到,我正在将参数传递给一个方法,该方法又会设置一个类成员变量,然后使用另一个方法检索该值。
有没有人能建议更优雅的模式?
大部分IronPython的文档都是说明如何使用C#调用IronPython方法,但我已经找出如何设置方法参数并检索方法返回值,但不能在同一个方法中完成。您可以在下面的示例中看到,我正在将参数传递给一个方法,该方法又会设置一个类成员变量,然后使用另一个方法检索该值。
有没有人能建议更优雅的模式?
using System;
using System.Windows.Forms;
using IronPython.Hosting;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
namespace PythonScripting.TestApp
{
public partial class Form1 : Form
{
private ScriptEngine m_engine = Python.CreateEngine();
private ScriptScope m_scope = null;
//used to call funcs by Python that dont need to return vals
delegate void VoidFunc(string val);
public Form1()
{
InitializeComponent();
}
private void doSomething()
{
MessageBox.Show("Something Done", "TestApp Result");
}
private string _rslt = "";
private string getSomething()
{
return _rslt;
}
private void setSomething(string val)
{
_rslt = val;
}
private void Form1_Load(object sender, EventArgs e)
{
m_scope = m_engine.CreateScope();
Func<string> PyGetFunction = new Func<string>(getSomething);
VoidFunc PySetFunction = new VoidFunc(setSomething);
m_scope.SetVariable("txt", txtBoxTarget);
m_scope.SetVariable("get_something", PyGetFunction);
m_scope.SetVariable("set_something", PySetFunction);
}
private void button1_Click(object sender, EventArgs e)
{
string code = comboBox1.Text.Trim();
ScriptSource source = m_engine.CreateScriptSourceFromString(code, SourceCodeKind.SingleStatement);
try
{
source.Execute(m_scope);
Func<string> result = m_scope.GetVariable<Func<string>>("get_something");
MessageBox.Show("Result: " + result(), "TestApp Result");
}
catch (Exception ue)
{
MessageBox.Show("Unrecognized Python Error\n\n" + ue.GetBaseException(), "Python Script Error");
}
}
}
}