如何创建跨平台测试
通常情况下,在一个平台上记录的 Squish 测试不仅可以在该平台上回放,还可以在任何 Squish 支持的平台上回放。例如,为 Linux 上的 Qt 应用程序记录的测试通常可以在 Linux、macOS 和 Windows 上回放。然而,在某些情况下,跨平台回放可能无法工作——至少不是即插即用。
如何创建跨平台的 Java AWT/Swing 测试
使用 Java AWT/Swing 自动化工具(AUT)记录的测试应该可以在任何 Java 平台上回放。因此,在 Windows 上记录的测试应该可以在 macOS 或 Linux 上回放,依此类推。遗憾的是,当记录涉及文件选择对话框时,这种情况并不成立。如果一个涉及文件选择对话框的测试在 Windows 或 Linux 上记录,则可以在任一平台上正确回放。但是在 macOS 上将无法工作,因为 Java AWT/Swing 在不同平台间存在差异。
例如,如果我们记录文件的打开——但不是在 macOS 上——Squish 将会记录如下代码
startApplication('"' + os.environ["SQUISH_PREFIX"] + '/examples/java/addressbook/AddressBookSwing.jar"') activateItem(waitForObjectItem(names.address_Book_JMenuBar, "File")) activateItem(waitForObjectItem(names.file_JMenu, "Open...")) type(waitForObject(names.open_File_Name_JTextField), "MyAddresses.adr") clickButton(waitForObject(names.open_Open_JButton))
startApplication('"' + OS.getenv("SQUISH_PREFIX") + '/examples/java/addressbook/AddressBookSwing.jar"'); activateItem(waitForObjectItem(names.addressBookJMenuBar, "File")); activateItem(waitForObjectItem(names.fileJMenu, "Open...")); type(waitForObject(names.openFileNameJTextField), "MyAddresses.adr"); clickButton(waitForObject(names.openOpenJButton));
startApplication("\"$ENV{'SQUISH_PREFIX'}/examples/java/addressbook/AddressBookSwing.jar\""); activateItem(waitForObjectItem($Names::address_book_jmenubar, "File")); activateItem(waitForObjectItem($Names::file_jmenu, "Open...")); type(waitForObject($Names::open_file_name_jtextfield), "MyAddresses.adr"); clickButton(waitForObject($Names::open_open_jbutton));
startApplication("\"#{ENV['SQUISH_PREFIX']}/examples/java/addressbook/AddressBookSwing.jar\"") activateItem(waitForObjectItem(Names::Address_Book_JMenuBar, "File")) activateItem(waitForObjectItem(Names::File_JMenu, "Open...")) type(waitForObject(Names::Open_File_Name_JTextField), "MyAddresses.adr") clickButton(waitForObject(Names::Open_Open_JButton))
startApplication "\"$::env(SQUISH_PREFIX)/examples/java/addressbook/AddressBookSwing.jar\"" invoke activateItem [waitForObjectItem $names::Address_Book_JMenuBar "File"] invoke activateItem [waitForObjectItem $names::File_JMenu "Open..."] invoke type [waitForObject $names::Open_File_Name_JTextField] "MyAddresses.adr" invoke clickButton [waitForObject $names::Open_Open_JButton]
为了使这一点跨平台(即在 Windows、Linux 和 macOS 上)可行,我们必须将使用 type(objectOrName, text) 函数(如代码缩进所示——当然这对 Python 并不是真的)的行替换为一些可在 macOS 上正常工作的自定义代码,并在其他平台上回退到原始代码。以下是替换 type
行所需的代码
if java_lang_System.getProperty("os.name").startswith("Mac OS"): table = waitForObject(names.open_JTable) rows = object.children(table) for row in rows: cells = object.children(row) if cells[0].toString().endswith("MyAddresses.adr"): mouseClick(cells[0]) break else: type(waitForObject(names.open_File_Name_JTextField), "MyAddresses.adr")
if (java_lang_System.getProperty( "os.name" ).indexOf( "Mac OS") == 0) { var ftable = waitForObject(names.openJTable); var rows = object.children(ftable); for (var i = 0; i < rows.length; ++i) { var cells = object.children(rows[i]); if (cells[0].toString().indexOf("MyAddresses.adr") > -1) { mouseClick(cells[0]); break; } } } else { type(waitForObject(names.openFileNameJTextField), "MyAddresses.adr"); }
if (java_lang_System::getProperty( "os.name" ) =~ /Mac OS/) { my $ftable = waitForObject($Names::open_jtable); my @rows = object::children($ftable); foreach my $row (@rows) { my @cells = object::children($row); if ($cells[0]->toString() =~ /MyAddresses\.adr$/) { mouseClick($cells[0]); last; } } } else { type(waitForObject($Names::open_file_name_jtextfield), "MyAddresses.adr"); }
if LC::Java_lang_System.getProperty("os.name").start_with?("Mac OS") table = waitForObject(Names::Open_JTable) rows = Squish::Object.children(table) for row in rows cells = Squish::Object.children(row) cell = String(cells[0]) if cell.match("MyAddresses.adr$") mouseClick(cells[0]) break end end else type(waitForObject(Names::Open_File_Name_JTextField), "MyAddresses.adr") end
if {[string match "Mac OS*" [invoke java_lang_System getProperty "os.name"]]} { set ftable [waitForObject $names::Open_JTable] set rows [object children $ftable] foreach row $rows { set cells [object children $row] if { [string last "MyAddresses.adr" [toString [lindex $cells 0]]] > -1 } { invoke mouseClick [lindex $cells 0] break } } } else { invoke type [waitForObject $names::Open_File_Name_JTextField] "MyAddresses.adr" } invoke clickButton [waitForObject $names::Open_Open_JButton]
使用此代码,测试脚本应在 Linux、macOS 和 Windows 上正确回放。
©2024 Qt 公司有限公司。此处包含的文档贡献属于其各自的权利人。
提供的文档按照自由软件基金会发布的 GNU 通用文档许可协议1.3版本 的条款许可。
Qt 和相应的标志是芬兰和/或世界上其他国家的 Qt 公司的商标。所有其他商标属于其各自的权利人。