Как получить TopLevelTestObject из ProcessTestObject в RFT?

Имея ProcessTestObject, есть ли способ получить окно, связанное с этим процессом, как BrowserTestObject или, по крайней мере, TopLevelTestObject? Например.

// Open IE at http://www.google.com/
ProcessTestObject browserProcess = startApp("Google");
// Wait for the browser to load...there's probably a better way, but I don't know it.
sleep(10);
// Now what?

У ProcessTestObject, похоже, нет дочерних элементов, которые я могу использовать. я пробовал

browserProcess.find(atDescendant(".class", "Html.HtmlBrowser"));

и

browserProcess.find(atDescendant(".class", "Html.HtmlDocument"));

но ни один поиск не дает результатов. Попытка найти определенные теги HTML также не удалась.

Я мог бы поискать в RootTestObject HtmlBrowser, и это, вероятно, сработало бы в 98% случаев. Тем не менее, я действительно предпочел бы способ гарантировать, что я захватываю только что запущенный браузер, а не какое-то случайное окно, которое, возможно, осталось открытым из предыдущего теста. Единственная другая альтернатива, о которой я могу думать, - это искать все окна браузера и закрывать их заранее, но я подумал, что может быть более простое решение.


person Doval    schedule 15.07.2013    source источник


Ответы (1)


Что ж, закрытие браузеров и открытие нового — хорошая идея, потому что, когда воспроизведение ищет объекты, ему не придется искать в старых браузерах.

Другой способ получить ProcessTestObject может быть:

public void testMain(Object[] args) 
{
    ProcessTestObject pto = startBrowser("http://www.myurl.com");
    System.out.println("PTO "+ pto.getProcessId());
    TestObject[] browsers = find(atChild(".class", "Html.HtmlBrowser" ));
    for(TestObject browser:browsers)
    {
        if(pto.getProcessId() == browser.getProcess().getProcessId())
        {
            //we hv a match, use it 
            ((BrowserTestObject)browser).maximize();
        }

    }
    unregisterAll();    

}

//Примечание: для IE8 и более поздних версий вам необходимо установить флаг в файле ivory.properties в значение true

person Prakash    schedule 15.07.2013
comment
После изменения файла ivory.properties и экспериментов с вашим решением я получаю противоречивые результаты. Иногда startApp/startBrowser сообщает правильный идентификатор процесса, иногда нет. Я придумал альтернативное решение; вместо того, чтобы проверять браузер с идентификатором процесса, совпадающим с тем, который был возвращен startApp, я проверяю браузер, чей идентификатор процесса не существовал до вызова startApp. Это должно работать правильно, независимо от конфигурации RFT или поведения startApp. - person Doval; 16.07.2013
comment
Как насчет закрытия всех открытых окон браузера перед запуском нового браузера? Вы можете попробовать оба и посмотреть, какой из них более эффективен. - person Prakash; 18.07.2013
comment
Я, вероятно, в конечном итоге также закрою браузеры, но я хотел что-то вернуться. Теоретически попытка закрыть окно браузера может потерпеть неудачу; например, если он вызывает диалоговое окно с вопросом, действительно ли я хочу закрыть несколько вкладок. - person Doval; 19.07.2013