Изменение семантики операции getCurrentUrl в Selenium

Изменение семантики операции getCurrentUrl в Selenium

В следующей версии Selenium произойдёт изменение, которое нарушает обратную совместимость, но увеличивает совместимость со стандартом W3C WebDriver: операция getCurrentUrl будет возвращать адрес, который пользователь видит в адресной строке браузера, а не адрес текущего фрейма.

Соответственно, это изменение затронет тех, кто активно работает с фреймами, в частности, проверяет их адреса.

Дальше подробности для тех, кто забеспокоился :)

Почему при разработке стандарта было принято решение об изменении семантики этой операции?

Причин целых две:

1) “Бытовая”: инструмент должен возвращать тот адрес, который видит пользователь. Ранее, руководствуясь той же самой логикой, было принято решение о том, что операция getTitle должна возвращать не заголовок текущего фрейма, а заголовок фрейма верхнего уровня, тот самый, который пользователь видит в названии окна или вкладки браузера.

2) “Техническая”: получить адрес текущего фрейма можно и через JavaScript, а вот получить адрес контекста верхнего уровня через JavaScript невозможно из соображений безопасности – браузер не разрешает выходить за пределы текущего контекста, если при этом нарушается знаменитое правило same origin policy. Поэтому решили, что операция для получения адреса контекста верхнего уровня является более важной.

Что надо сделать, чтобы заранее подготовиться к выходу следующей версии Selenium?

  • найти все места, где используется операция getCurrentUrl
  • если там никаких фреймов нет – значит вы в полной безопасности
  • если эта операция используется для получения адреса текущего фрейма – надо вместо неё использовать вот такой вспомогательный метод:
public String getCurrentFrameUrl(WebDriver driver) {
  return ((JavascriptExecutor) driver)
    .executeScript("return window.location.href").toString();
}