Избегайте остановки выполнения при просмотре в Selenium WebDriver

Мне нужна помощь для этой штуки, которая сводит меня с ума. Я хочу проверить URL-адрес браузера и бесконечный цикл, немного подождав (Thread.Sleep) между циклом и другим, чтобы не перегружать ЦП. Затем, если мне нужен URL-адрес браузера, я хочу добавить/изменить/удалить элемент с помощью Javascript до того, как страница будет полностью загружена, иначе человек, который использует это, может увидеть изменение. (Мне не нужна помощь для части javascript) Но есть проблема: кажется, что в Selenium Webdriver, когда я перехожу на страницу (с помощью .get(), .navigate().to() или также непосредственно из клиента ) выполнение принудительно останавливается до тех пор, пока страница не будет загружена. Я пытался установить «поддельный» тайм-аут, но (по крайней мере, в Chrome), когда он перехватывает TimeoutException, страница перестает загружаться. Я знаю, что в Firefox есть опция нестабильной загрузки, но я не хочу ее использовать, потому что моя программа не только для Firefox.

public static void main(String[] args) throws InterruptedException {        
    System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
    WebDriver driver = new ChromeDriver();
    driver.manage().timeouts().pageLoadTimeout(0, TimeUnit.MILLISECONDS); // Fake timeout
    while (true) {
        try {
            // If the url (driver.getCurrentUrl()) is what I want, then execute javascript without needing that page is fully loaded
            // ...
            // ...               
        }
        catch (TimeoutException e) {
             // It ignores the Exception, but unfortunately the page stops loading.
        }
        Thread.sleep(500); // Then wait some time to not overload the cpu
    }
}

Мне нужно сделать это в Chrome и, если возможно, в Firefox и Internet Explorer. Я программирую на Java. Заранее спасибо.


person Costantino Grasso    schedule 30.12.2015    source источник


Ответы (2)


Selenium предназначен для остановки после загрузки веб-страницы в браузер, чтобы она могла продолжить выполнение.

В вашем случае есть два варианта:

1) Если URL-адрес браузера изменится автоматически (ajax) в произвольное время, просто продолжайте получать URL-адрес браузера, пока ваше условие не будет удовлетворено.

while(currentURL.equals("Your Condition")){
  currentURL = driver.getCurrentUrl();
  Thread.sleep(2000);
}

2) Если браузер необходимо обновить, используйте метод обновления в цикле, пока не получите желаемый URL-адрес.

while(currentURL.equals("Your Condition")){
    driver.navigate().refresh();
    currentURL = 
    Thread.sleep(2000);
}
person parishodak    schedule 31.12.2015
comment
Спасибо. Если у меня есть несколько вкладок в хроме? Я пробовал, и он проверяет только вкладку, открытую с помощью нового ChromeDriver();. Есть ли способ проверить URL-адрес активной вкладки и выполнить в ней некоторый javascript? Однако в вашем цикле while я попытался напечатать URL-адрес (System.out.println(currentURL)) и увидел, что при переходе на страницу цикл, кажется, останавливается до определенного момента (я полагаю, он ждет загрузки страницы): так проблема осталась :\ .. Во всяком случае, я могу обойтись и без этого, но мне нужно, чтобы Selenium действовал на активной вкладке. Какая-то идея? - person Costantino Grasso; 31.12.2015
comment
Как вы процитировали, селен контролирует только те экземпляры браузера, которые он запустил через new ChormeDriver(); Если селен запустил несколько вкладок, вы можете перейти на разные вкладки, как описано в этом сообщении веб-драйвер селена"> stackoverflow.com/questions/12729265/ - person parishodak; 31.12.2015
comment
Да это работа. Я просмотрел каждую вкладку и проверил каждый URL. Итак, хорошо... но я видел, что Selenium останавливается до тех пор, пока не загрузится КАЖДАЯ ОТДЕЛЬНАЯ СТРАНИЦА... есть ли способ избежать этого? Мне не нужно, чтобы они были полностью загружены для выполнения js.. - person Costantino Grasso; 31.12.2015
comment
рад, что это помогло. selenium предназначен для ожидания загрузки страницы, чтобы он мог выполнять действия пользователя на отображаемой странице. пожалуйста, проголосуйте за ответ, если решение удовлетворительное. - person parishodak; 31.12.2015
comment
Да, я сделал, когда у меня будет 15 очков репутации, голосование будет отображаться. = Д - person Costantino Grasso; 31.12.2015
comment
Подождите, у меня другая проблема... если я отсоединяю вкладку и превращаю ее в окно, цикл .getWindowHandles() для нее больше не работает. Могу ли я также пройти через несколько окон хромированного драйвера? - person Costantino Grasso; 31.12.2015
comment
Когда вы отсоединяете, он становится окном вместо вкладки. поэтому вы не сможете выполнять итерацию с помощью вкладок. Некоторая помощь в работе с несколькими окнами браузера, пожалуйста, обратитесь: seleniumeasy.com/selenium-tutorials/ - person parishodak; 31.12.2015
comment
Также в SO не рекомендуется обсуждение цепных решений в разделах комментариев, поскольку это не будет полезно для сообщества, которое обычно ссылается на ответ, а не на комментарии. пожалуйста, опубликуйте новый вопрос с более подробной информацией. либо я, либо кто-то даст ответы. - person parishodak; 31.12.2015

Как известно, если пользователь попытался с помощью driver.get("url");, селен ждет, пока страница загрузится (может быть не очень долго). поэтому, если вы хотите что-то сделать при переходе к URL-адресу, не дожидаясь общего времени загрузки, используйте приведенный ниже код вместо получения или навигации

    JavascriptExecutor js=(JavascriptExecutor)driver;
    js.executeScript("window.open('http://seleniumtrainer.com/components/buttons/','_self');");

После этого использовали

driver.findElement(By.id("button1")).click();

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

Я надеюсь, что это поможет вам разобраться в вашей проблеме при запуске. for loop, я надеюсь, что решение уже предоставлено.

Спасибо

person murali selenium    schedule 31.12.2015
comment
Нет, Selenium ждет любой навигации. Через javascript (window.location, window.open...), через клиент (ввод непосредственно в адресную строку или переход вперед или назад), через .get, .navigate().to() и так далее. Может исключения есть исключения xD - person Costantino Grasso; 31.12.2015
comment
@CostantinoGrasso, спасибо за информацию, но я пробовал использовать вышеприведенное выполнение javascript вместо get, но не ждал. Я попробовал и дал ответ. - person murali selenium; 31.12.2015
comment
если это не так, дайте мне знать. я удалю этот ответ. - person murali selenium; 31.12.2015
comment
Какую версию Selenium и Chrome вы используете? У меня Selenium 2.48.2 и Chrome 47.0.2526.106 м - person Costantino Grasso; 31.12.2015
comment
Я думаю, что разные браузеры вызывают некоторую разницу в исполнении. - person Costantino Grasso; 31.12.2015