В мобильной версии моего веб-сайта у меня есть диалоговое окно подтверждения JavaScript, которое появляется при определенных обстоятельствах. Используя setTimeout
я запускаю диалог подтверждения. Независимо от того, в какую вкладку находится пользователь, он должен увидеть confirm dialog
но в iOS 10 теряет фокус.
В iOS версии 8 и 9 отлично работает, когда у меня есть две вкладки, и я нахожусь на второй вкладке, диалоговое окно подтверждения отображается спереди так, как должно.
Есть ли решение или обходное решение для этого?
var cf = confirm("Close?");
if (cf){ do that....} else { do this... }
SafariDriver реализован в JS, поэтому для перехвата вызовов для alert
, confirm
и prompt
необходимо переопределить функции в контексте веб-страницы.
Измените введенный сценарий, который будет вставляться в качестве сценария Start
вместо сценария End
что означает, что скрипт вводится после загрузки DOM, но до того, как он был разобран (вместо того, чтобы вводиться после события onload):
Переопределите глобальные функции оповещения в контексте тестируемой страницы, а не вложенный сценарий. Это похоже на требования команды executeScript. Поэтому первое, что должен сделать наш инъецируемый скрипт, это добавить тег сценария в DOM, который устанавливает предупреждения. Этот тег скрипта должен быть добавлен в качестве первого дочернего элемента documentElement для обеспечения его выполнения перед любыми другими страницами. Это обеспечит настройку наших обработчиков предупреждений, прежде чем что-либо на странице сможет запустить предупреждение.
Как только предупреждение срабатывает, мы должны уведомить расширение о наличии предупреждения, одновременно блокируя текущий поток JS на странице. Обычно наши скрипты страниц взаимодействуют с вложенным скриптом, используя window.postMessage. postMessage запускает MessageEvent асинхронно. Чтобы поддерживать синхронность, мы можем вручную запустить MessageEvent:
Use a MessageEvent instead of some other DOM event so we can include a JSON object describing the alert.
var event = document.createEvent('MessageEvent');
event.initMessageEvent('message', false, false, {
type: "alert", // confirm, or prompt
text: "hello"
}, window.location.origin, '0', window, null);
window.dispatchEvent(event);
Введенный сценарий должен прослушивать ответ на сообщение с предупреждением страницы. Чтобы синхронно отправить предупреждение на расширение для обработки, мы можем (ab) использовать механизм расширения Safari для блокировки содержимого из загрузки:
window.addEventListener('message', function(e) {
// Create a beforeload event, which is required by the canLoad method
var e = document.createEvent('Events');
e.initEvent('beforeload', false, false);
// canLoad sends and waits for a response synchronously. It is the only
// synchronous function in the Safari extension messaging API.
var response = safari.self.tab.canLoad(e, e.data);
// Send the response back to the page using another MessageEvent.
var responseEvent = document.createEvent('MessageEvent');
responseEvent.initMessageEvent('message', false, false, {
accepted: response.accepted,
response: response.value
}, window.location.origin, '0', window, null);
window.dispatchEvent(responseEvent);
}, true);
Обратите внимание: ответ на добавочный номер должен быть отправлен обратно на страницу с помощью другого сообщения, поскольку мы пересекаем границы контекста. Единственный другой вариант - сохранить ответ на DOM для чтения с другой стороны.
Последний шаг, и это открытый вопрос, заключается в том, как расширение должно обрабатывать предупреждение. Поскольку мы поддерживаем поведение блокировки предупреждений, невозможно выполнить больше команд (даже если они приводят к необработанным предупреждениям).
Одна из возможностей заключается в том, чтобы клиент WebDriver участвовал в обработке предупреждений. В дополнение к предоставлению сервера WebSocket ожидается, что клиент WebDriver также предоставит конечную точку XHR. Когда обнаружено предупреждение, сервер отправит синхронный POST XHR в эту конечную точку. Клиент должен отвечать только после того, как пользователь принял или отклонил предупреждение (или необработанная ошибка предупреждения была сброшена из другой команды). Когда принимается XHR-ответ, расширение завершает цепочку и отправляет ответ обратно на вложенный сценарий.
Вы можете найти больше здесь.