Определить нажатие кнопки (по имени класса) в WKWebView с помощью JavaScript .evaluate - PullRequest
1 голос
/ 07 апреля 2020

В течение последних нескольких часов я пытался добавить слушателя, когда пользователь щелкает по этому элементу кнопки в WKWebView:

<div class="web-navigation__auth" data-test-web-chrome-auth="">
    <button class="web-navigation__auth-button web-navigation__auth-button--sign-in button button-reset button--auth">
        <svg ... ></path></g></svg>
        Sign In
    </button>

    <div class="web-chrome-auth-container__spinner web-chrome-auth-container__spinner--hidden"></div>
</div>

Я пытался наблюдать, используя множество различных JavaScript оценки, и пробовал код в разных местах (ie. viewDidLoad, webView(didFinish), webView(didStartProvisionalNavigation), et c):

let js1 = "document.addEventListener('click', function(e) { e = e || window.event; if(e.target.getAttribute('class') == 'web-navigation__auth-button') { console.log(e.target.value); } });"
let js2 = "var elements = document.getElementsByClassName('web-navigation__auth'); var myFunction = function() { var attribute = this.getAttribute('web-navigation__auth-button--sign-in'); alert(attribute); }; for (var i = 0; i < elements.length; i++) { elements[i].addEventListener('click', myFunction, false); }"
let js3 = "document.addEventListener('click', getElementsByClassName('web-navigation__auth-button').onclick();"

webView.evaluateJavaScript(js) { (key, err) in
    if let err = err {
        print(err.localizedDescription)
    } else {
        print("JS: You tapped the Sign In button!")
    }
}

Вывод на консоль только кажется появляются при каждом вызове webView.evaluateJavaScript, не при нажатии кнопки. Я не получил какой-либо код для запуска при нажатии кнопки, кроме примечания ниже относительно js3. Это вывод на консоль для каждого JS вызова в webView(didFinish):

js1: A JavaScript exception occurred     // on webView.didFinish
     JS: You tapped the Sign In button!  // on webView.didFinish

js2: A JavaScript exception occurred     // on webView.didFinish
     JS: You tapped the Sign In button!  // on webView.didFinish

js3: A JavaScript exception occurred     // on webView.didFinish
     A JavaScript exception occurred     // on Sign In button click (fired again)

Одна вещь, о которой следует отметить js3, заключается в том, что она выдаст сообщение об ошибке на webView.didFinish, но это также сгенерирует ошибку при нажатии кнопки.

Таким образом, теоретически я мог бы создать флаг для проверки нажатия этой кнопки; однако я предпочел бы что-то более конкретное, чем этот хакерский обходной путь:

// Error output to console on every new page load AND "Sign In" button click
var pageLoad = false    // Page has not yet loaded, false by default

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    pageLoad = true     // Page has loaded, unless new URL detected, next error = button click!
    if webView.urlHasChanged() { pageLoad = false }

    let js3 = "document.getElementsByClassName('web-navigation__auth-button').onclick();"
    webView?.evaluateJavaScript(js3) { (key, err) in
    if let err = err {  
        if pageLoad {
            // Error message && pageLoad = "Sign in" button pressed: CODE HERE
        }
    }
    if pageLoad && url.hasNotChanged() { pageLoad = false }
}

Любая помощь будет высоко ценится, и спасибо, что нашли время, чтобы прочитать этот вопрос!

...