मेरा दृष्टिकोण प्रत्येक लिंक पर जाना है और यदि सभी से वापसी मूल्य प्राप्त करने के लिए दौरा किया जाता है। समस्या यह है कि जब मैं कोड शुरू करता हूं, तो मुझे तुरंत एक प्रतिक्रिया मिलती है, स्पष्ट रूप से खाली क्योंकि सभी लिंक का दौरा नहीं किया जाता है।

    private async void ibtn_start_visiting_Click(object sender, EventArgs e)
    {
        string js = "var ele = document.querySelectorAll('#profiles * .tile__link');document.getElementsByClassName('js-scrollable')[0].scrollBy(0,30);ele.forEach(function(value,index){setTimeout(function(){if(index < ele.length-1){ele[index].click();}else{document.querySelectorAll('.search-results__item').forEach(e => e.parentNode.removeChild(e));document.getElementsByClassName('js-close-spotlight')[0].click();return 'hallo';}},1000 * index)})";
    
        await browser.EvaluateScriptAsync(js).ContinueWith(x =>
        {
            var response = x.Result;

            if (response.Success)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    var res = (string)response.Result;
                    Console.WriteLine("Response: " + res);
                    
                    
                });
            }
            else {
                Console.WriteLine("NO");
            }
            
        });



    }

यह जावास्क्रिप्ट है:

var ele = document.querySelectorAll('#profiles * .tile__link');
document.getElementsByClassName('js-scrollable')[0].scrollBy(0,30);
ele.forEach(function(value,index){
    setTimeout(function(){
        if(index < ele.length-1){
            ele[index].click();
            
        }
        else{
            
            document.querySelectorAll('.search-results__item').forEach(e => e.parentNode.removeChild(e));
            document.getElementsByClassName('js-close-spotlight')[0].click();
            alert('hallo');
        }
    },1500 * index)
})
0
JonnyDough 3 अक्टूबर 2020, 16:18

1 उत्तर

सबसे बढ़िया उत्तर

ओह मैं समझा। आपका जावास्क्रिप्ट setTimeout का उपयोग कर रहा है, जो आपके द्वारा पास किए गए फ़ंक्शन को एसिंक्स बनाने के बराबर है। CefSharp को पता नहीं होता है कि वे setTimeout कार्य कब पूरे होते हैं, इसलिए जल्दी वापसी होती है। लंबित जावास्क्रिप्ट कोड अंततः निष्पादित करता है। यह जानने के लिए कि यह कब पूरा हो गया है, आपके पास कुछ विकल्प हैं:

  1. setTimeout से पूरी तरह छुटकारा पाकर अपने एसिंक्स जावास्क्रिप्ट कोड को सिंक्रोनस बनाएं।
  2. अपने एसिंक्स जावास्क्रिप्ट कोड में कुछ वैश्विक चर सेट करें और समय-समय पर सी # में अपने वेबपृष्ठ की जांच करें कि यह चर सेट है या नहीं।
  3. कुछ जेएस हैंडलर पंजीकृत करें और कॉल करें कि जब आपका एसिंक जावास्क्रिप्ट पूरा हो जाए।

# 3 मेरा पसंदीदा है, इसलिए आप उस हैंडलर को सी # में पंजीकृत कर सकते हैं जैसे:

public class CallbackObjectForJs{
    public void showMessage(string msg){
        // we did it!
    }
}

webView.RegisterJsObject("callbackObj", new CallbackObjectForJs());

और आपका जेएस कुछ ऐसा दिख सकता है:

var totalTasks = 0;
function beginTask() {
  totalTasks++;
}
function completeTask() {
  totalTasks--;
  if (totalTasks === 0) {
    callbackObj("we finished!"); // this function was registered via C#
  }
}

var ele = document.querySelectorAll('#profiles * .tile__link');
document.getElementsByClassName('js-scrollable')[0].scrollBy(0,30);
ele.forEach(function(value,index){
    beginTask();  // NEW
    setTimeout(function(){
        ... // work
        completeTask();
    }, 1500 * index);
})

इस क्लीनर को बनाने के लिए आप Javascript के Promise.all() पर गौर कर सकते हैं।

0
loremdipso 3 अक्टूबर 2020, 17:36