Функция открытия Selenium ждет до чего? - PullRequest
2 голосов
/ 22 сентября 2009

Когда я вызываю метод Open («[some URL]») в Selenium, он ждет, пока все ресурсы (изображения, CSS, JS) не будут загружены. Но как он узнает, что браузер выполняет запрос ресурсов?

Вот мой фрагмент кода драйвера (в C #):

DefaultSelenium selenium = new DefaultSelenium(
    "localhost", 4444, "*iexplore", "http://www.stackoverflow.com");

// open my profile page
selenium.Open("http://stackoverflow.com/users/111934/jeff-meatball-yang");

URL-адрес выше приведен только для примера. В случае, когда у меня вызов AJAX обернут с очень большой задержкой в ​​setTimeout(), запускаемом в обработчике события body onload, Selenium не будет ждать этого вызова AJAX, прежде чем продолжить ... Я должен вручную сказать Селен ждать с помощью WaitForPageToLoad(timeout).

Так как Selenium обнаруживает, когда нормальная страница (без AJAX) завершает загрузку?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2009

Я полагаю, что он ждет, пока location.href будет доступен, что означает, что если у вас запущен AJAX после этой точки, вам также нужно будет использовать waitForCondition.

selenium.open("http://www.example.com/");
selenium.waitForCondition("var value = selenium.getText('id=pageLoadStatus'); value == 'Loaded'", "60000");

Ниже приведен код обнаружения загрузки текущей страницы из ядра Selenium:

this.recordPageLoad = function(elementOrWindow) {
    LOG.debug("Page load detected");
    try {
        if (elementOrWindow.location && elementOrWindow.location.href) {
            LOG.debug("Page load location=" + elementOrWindow.location.href);
        } else if (elementOrWindow.contentWindow && elementOrWindow.contentWindow.location && elementOrWindow.contentWindow.location.href) {
            LOG.debug("Page load location=" + elementOrWindow.contentWindow.location.href);
        } else {
            LOG.debug("Page load location unknown, current window location=" + this.getCurrentWindow(true).location);
        }
    } catch (e) {
        LOG.error("Caught an exception attempting to log location; this should get noticed soon!");
        LOG.exception(e);
        self.pageLoadError = e;
        return;
    }
    self.newPageLoaded = true;
};
1 голос
/ 20 февраля 2011

@ Dave Hunt, вы правы, что recordPageLoad называется , но он просто регистрирует местоположение загрузки страницы (location.href), если доступно, и устанавливает self.newPageLoaded = true, значение, возвращаемое isNewPageLoaded и, таким образом, doOpen.

isNewPageLoaded вызывается в selenium-api.js _isNewPageLoaded <= <code>makePageLoadCondition <= <code>doOpen. И doOpen вызывается после того, как Selenium IDE запускает команду open.

Соответствующий след:

doOpen звонки (переход на selenium-browserbot.js) openLocation => getCurrentWindow => _modifyWindow => modifySeparateTestWindowToDetectPageLoads (который, согласно комментарию над ним, ждет "по непрерывный опрос, пока документ не изменится и не будет загружен полностью ) => pollForLoad => getReadyState.

getReadyState возвращает document.readyState (rs), а pollForLoad ожидает до rs == 'complete', т. Е. До полной загрузки страницы, изображений и всего.

Эйс Вентура объясняет это лучше, чем я.


P.S. @ Дэйв Хант, спасибо за ваш скрипт управления потоком данных Selenium IDE на GitHub . Это пригодилось! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...