在Xamarin.UiTest

时间:2019-06-10 07:36:43

标签: xamarin.android android-custom-view xamarin.uitest

我有一个由Android类库项目创建的自定义android view类,该项目名为“ components”,具有在Resources / values / Attrs.xml中定义的自定义属性

<?xml version="1.0" encoding="utf-8" ?>
<resources>
  <declare-styleable name="SwitchWithData">
   ...
    <attr name="isOn" format="boolean"/>
  </declare-styleable>
</resources>

自定义视图类是在CustomView.cs中使用公共属性定义的。

 public bool IsOn {
        get { return _isOn; }
        set { _isOn = value; SeIsOn(value); }
    }

在布局或代码中使用自定义视图时,我可以访问该属性。

android项目参考组件项目- resource / layout.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical">
                    ...
                    <Components.CustomView  
                     app:IsOn="true"
                     android:id="@+id/CustomView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"/>

</LinearLayout>

即使从代码访问属性也可以正常工作。 -MainActivity.cs

    customView = FindViewById<Components.CustomView>(Resource.Id.CustomView);
    customView.IsOn = true;

因此,问题是从Xamarin.UiTest项目访问此属性。通常,我通过调用此类的invoke方法来访问属性。

app.Query(x => x.Id("Switch").Invoke("isChecked").Value<bool>()).First();

这在android本机视图中正常工作,但是当我尝试使用相同的方法访问自定义视图的属性时,它将返回空对象。

app.Query(x => x.Id("CustomView").Invoke("isOn").Value<bool>()).First();

知道我在做什么错吗?

已解决

好的,我已经弄清楚了。问题出在组件类中。据此link,必须有一个名为Export属性的方法。

        [Export("IsSwitchedOn")]
        public bool IsSwitchedOn() {
            return IsOn;
        }

像这样您可以在UiTest中访问该方法。

app.Query(x => x.Id("CustomView").Invoke("IsSwitchedOn")); 

1 个答案:

答案 0 :(得分:0)

好的,我已经弄清楚了。问题出在组件类中。据此link,必须有一个名为Export属性的方法。

<!DOCTYPE html>
<html>
<style>
td
{
        padding: 0.5em;
}
.color-bg-green
{
        background-color: green;
}
.color-bg-red
{
        background-color: red;
}
.color-bg-yellow
{
        background-color: yellow;
}
.color-bg-orange
{
        background-color: orange;
}
.color-fg-white
{
        color: white;
}
.color-fg-black
{
        color: black;
}
</style>
<body>
<table>
<?php

$rowData = [];
$rowData[] =
['id' => 1, 'number' => 123, 'date' => '2020-01-01', 'device' => 'Smartphone', 'model' => 'Galaxy', 'problem' => 'Lorem ipsum', 'status' => 'success', 'assigned' => 'Person A'];
$rowData[] =
['id' => 2, 'number' => 123, 'date' => '2020-01-01', 'device' => 'Smartphone', 'model' => 'Galaxy', 'problem' => 'Lorem ipsum', 'status' => 'failure', 'assigned' => 'Person B'];
$rowData[] =
['id' => 3, 'number' => 123, 'date' => '2020-01-01', 'device' => 'Smartphone', 'model' => 'Galaxy', 'problem' => 'Lorem ipsum', 'status' => 'success', 'assigned' => 'Person C'];
$rowData[] =
['id' => 4, 'number' => 123, 'date' => '2020-01-01', 'device' => 'Smartphone', 'model' => 'Galaxy', 'problem' => 'Lorem ipsum', 'status' => 'pending', 'assigned' => 'Person D'];
$rowData[] =
['id' => 5, 'number' => 123, 'date' => '2020-01-01', 'device' => 'Smartphone', 'model' => 'Galaxy', 'problem' => 'Lorem ipsum', 'status' => 'processing', 'assigned' => 'Person E'];
$rowData[] =
['id' => 6, 'number' => 123, 'date' => '2020-01-01', 'device' => 'Smartphone', 'model' => 'Galaxy', 'problem' => 'Lorem ipsum', 'status' => 'success', 'assigned' => 'Person F'];

foreach ($rowData as $data)
{
        switch ($data['status'])
        {
                case 'success':
                {
                        $rowFgColor = 'white';
                        $rowBgColor = 'green';
                }
                break;
                case 'failure':
                {
                        $rowFgColor = 'black';
                        $rowBgColor = 'red';
                }
                break;
                case 'pending':
                {
                        $rowFgColor = 'black';
                        $rowBgColor = 'yellow';
                }
                break;
                default:
                case 'processing':
                {
                        $rowFgColor = 'black';
                        $rowBgColor = 'orange';
                }
                break;
        }
        echo "<tr class=\"color-fg-$rowFgColor color-bg-$rowBgColor\">";
        foreach (['id', 'number', 'date', 'device', 'model', 'problem', 'status', 'assigned'] as $column)
                echo "<td>{$data[$column]}</td>";
        echo "</tr>";
}
?>
</table>
</body>
</html>

像这样您可以在UiTest中访问该方法。

    [Export("IsSwitchedOn")]
    public bool IsSwitchedOn() {
        return IsOn;
    }