2

ループ内でisVisible()を使用して、iOSUIAutomation用のwaitForElementタイプの関数を作成しようとしています。次のコードを使おうとすると、新しい画面が表示されたときに要素を待っている間に失敗します。要素をタップする前にdelay(2)を実行すると、要素は完全に正常に機能するため、要素は明らかにそこにあります。私は途方に暮れているので、他のみんなはこれをどのように達成していますか...

これが私が使用しているwaitForElementコードです:

function waitForElement(element, timeout, step) {
        if (step == null) {
                step = 0.5;
        }

        if (timeout == null) {
            timeout = 10;
        }

        var stop = timeout/step;

        for (var i = 0; i < stop; i++) {
                if (element.isVisible()) {
                        return;
                }
                target.delay(step);
        }
        element.logElement();
        throw("Not visible");
}
4

1 に答える 1

0

この関数に「要素」オブジェクトを渡しています。関数が開始すると、「要素」オブジェクトにはisVisibleプロパティがfalseになるか、画面にそのようなオブジェクトがない場合は[object UIAElement Nil]を渡します。この種のオブジェクトのプロパティisVisibleを取得しようとすると、いつでもfalseが返されます。

この関数を機能させたい場合は、'element' をオブジェクトとして関数に渡す必要があります。だから代わりに

if (element.isVisible())

最初に要素オブジェクトを取得し、 isVisible() プロパティを取得する必要があります。

if (target.manWindow().elements()[0].isVisible())

この変更後、この関数は 1 つの要素でのみ機能するため、'element' オブジェクトを渡す必要はありません。

この関数を任意の要素で動作させるには、「要素」オブジェクトではなく、チェックしたい「要素」オブジェクトを返す関数を渡す必要があります。これは例です:

var target = ...;
var mainWindow = ...;

//function that returns firstObject
var firstElement = function()
{
return mainWindow.elements()[0];
}
//function that returns secondObject
var secondElement = function()
{
return mainWindow.elements()[1];
}

//これは、'wait' 関数で変更する必要があるものです。変化する

if (element.isVisible())

if (element().isVisible())

関数呼び出しの例:

waitForElement(firstElement, 10, 1);
waitForElement(secondElement, 10, 1);

注: firstElement()を使用してwaitForElement関数を呼び出すと、関数は同じエラーで失敗します。これにより、テストがより複雑になりますが、機能します。

于 2012-07-10T17:34:30.667 に答える