使用基类和ScreenObject编写Xamarin.UITest测试(二)

作者:ScreenObject编写Xamarin.UITest测试   发布时间:2021-10-12

MainScreen 和 AddingItemScreen

然后,我们需要创建MainScreenAddingItemScreen类来描述主屏幕和向我们的应用程序添加新项目的屏幕。此外,这里我们描述了一些与屏幕元素交互的方法。

此外,我们需要一个Screen将成为工厂类并返回某些页面实例的类。

这是一个工厂类,它将返回我们需要的屏幕实例。

class Screen
{

  private static MainScreen mainScreen;
  private static AddingItemScreen addingItemScreen;

  public static MainScreen Main => mainScreen ?? (mainScreen = new MainScreen());
  public static AddingItemScreen AddingItem => addingItemScreen ?? (addingItemScreen = new AddingItemScreen());

}

MainScreen类描述我们的应用程序的主屏幕。之前,我们已经BaseScreen使用基本方法创建了类。MainScreenBaseScreen继承现在我们可以使用那里描述的方法与页面元素进行交互。

class MainScreen : BaseScreen
{
  //Add button locator
  Func<AppQuery, AppQuery> addButton = x => x.Marked("Add");

  //Waiting Add button
  public void WaitForAddButton()
  {
    WaitForElement(addButton);
  }

  //Clicking Add button
  public void ClickAddButton()
  {
    Tap(addButton);
  }

  // Checking is item name present in the list
  public bool IsItemNamePresent(string ItemName)
  {
    return IsElementPresentByText(ItemName);
  }

  // Checking is item description present in the list
  public bool IsItemDescriptionPresent(string ItemDescription)
  {
    return IsElementPresentByText(ItemDescription);
  }
}

同为 AddingItemScreen

class AddingItemScreen : BaseScreen { 
  private readonly Func<AppQuery, AppQuery> itemNameField = x => x.Marked("item_name_Container").Descendant().Index(1); 
  private readonly Func<AppQuery, AppQuery> itemDescriptionField = x => x.Marked("item_description_Container").Descendant().Index(1); 
  private readonly Func<AppQuery, AppQuery> saveButton = x => x.Marked("save_button"); 
  //设置项目名称
  public void SetItemName(string ItemName) 
  { 
    Type(ItemName, itemNameField); 
  } 
  //设置项目描述
  public void SetItemDescription(string ItemDescription) 
  { 
    Type(ItemDescription, itemDescriptionField); 
  }
  //点击保存按钮
  public void TapSaveButton() 
  { 
    Tap(saveButton); 
  } 
  //等待保存按钮
  public void WaitForSaveButton() 
  { 
    WaitForElement(saveButton); 
  } }

在我们描述了返回所需类的实例的所有必要屏幕和方法之后,我们可以使用我们项目的新结构重写测试

public class Tests : BaseTest { 
  public Tests(Platform platform) : base(platform) 
  { 
  } 
  [Test] 
  public void ItemCreationTest() 
  { 
    // 使用模板生成随机项目名称和描述:
    // item_name + timestamp 
    // item_description + timestamp 
    String itemName = "item_name" + new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(); 
    String itemDescription = "item_description" + new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds(); 
    //等待'添加'按钮
    //app.WaitForElement(x => x.Marked("Add")); 
    //等待“添加”按钮
    Screen.Main.WaitForAddButton();
    // 点击“添加”按钮
    Screen.Main.ClickAddButton(); 
    //等待“保存”按钮
    Screen.AddingItem.WaitForSaveButton(); 
    //将文本设置为“项目名称”文本字段
    Screen.AddingItem.SetItemName(itemName); 
    //将文本设置为“项目描述”文本字段
    Screen.AddingItem.SetItemDescription(itemDescription); 
    //点击“保存”按钮
    Screen.AddingItem.TapSaveButton(); 
    //使用生成的itemName验证项目是否存在
    Assert.IsTrue(Screen.Main.IsItemNamePresent(itemName)); 
    //使用生成的 itemDescription 验证项目是否存在
    Assert.IsTrue(Screen.Main.IsItemDescriptionPresent(itemDescription));

最后,如果我们想启动应用程序,但 Screen 类的方法是静态的,我们可以在不创建类实例的情况下请求它们,我们将获得请求的简短记录。

Screen.Main.WaitForAddButton(); Assert.IsTrue(Screen.Main.IsItemNamePresent(itemName));

本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-60725088-8054),我们将立即处理,马上删除。



沪ICP备07036474号-4 |

沪公网安备 31010702003220号

2015-2021 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd.