Προς το περιεχόμενο

Θέμα σε electronjs και executeJavaScript(getProfileName)


rafinos

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Γεια σας,

φτιάχνω ένα app σε electronjs του οποίου ένα κομμάτι είναι να κάνει κάποια αυτοματοποιημένα πράγματα πατώντας ένα κουμπί και φορτώνοντας ένα εξωτερικό site σε ένα <webview></webview>. Ο παρακάτω κώδικας λειτουργεί κανονικά (υπάρχει ένα «αλλά» θα το εξηγήσω παρακάτω). Όταν ανοίξει το παράθυρο, το παρακάτω μπορεί να τρέξει μόνο μια φορά και τρέχει κάθε φορά με τον ίδιο τρόπο. Κανονικά μέσα στο 'dom-ready' έχω και άλλο κώδικα αλλά με ενδιαφέρει μόνο το παρακάτω. Το πρόβλημα είναι το εξής:
Τις περισσότερες φορές το συγκεκριμένο τρέχει κανονικά. Υπάρχουν ωστόσο φορές που βγάζει το error που θα δείτε παρακάτω, αλλά είναι error στο vs code console όχι στο dev tools console του app. Το πρόβλημα εικάζω ότι είναι στο const data = await webview.executeJavaScript(getProfileName). Υπάρχει κάποιος τρόπος να είμαι σίγουρος ότι ακόμα και σε περίπτωση λάθους θα ξαναπροσπαθήσει να τρέξει το executeJavaScript(getProfileName) στο webview.

Όταν λέω ότι ο παρακάτω κώδικας τρέχει σωστά δεν το λέω έτσι. Μόλις δοκίμασα το app 6 φορές και τις 5 δεν μου έβγαλε το error. Θα βοηθούσε λέτε να δώσω ένα μικρό delay μπας και δημιουργείτε πρόβλημα επειδή τρέχει με το που φορτώσει η σελίδα;

const webview = document.getElementById('webview');

webview.addEventListener('dom-ready', async () => {

      if(webview.src === "https://www.somesite.com/"){
        if(localStorage.getItem("logged_in") === null){
          localStorage.setItem("logged_in","true");
          document.getElementById("username").setAttribute("disabled", "disabled");
          document.getElementById("password").setAttribute("disabled", "disabled");
          document.getElementById("connect").setAttribute("disabled", "disabled");
          document.getElementById("logged-in").style.visibility = "visible";
          try {
            const data = await webview.executeJavaScript(getProfileName);
            localStorage.setItem("profilename", await data);
            const prefix = "./src/";
            const fullpath = prefix + await localStorage.getItem("profilename") + "/";
            filesNeeded[0] = fullpath + filesNeeded[0];
            filesNeeded[1] = fullpath + filesNeeded[1];
            excludeList = fullpath + excludeList;
            await filesExist(filesNeeded);
          }catch(error){
              console.log(error.message);
          }
        }
      }
}


const getProfileName = `
function getProfileName(){
    const profileName = document.getElementsByClassName('someClass')[0];
    if(profileName !== undefined){
      let name = profileName.href;
      name = name.replace("https://www.somesite.com/","");
      name = name.replace("/","");
      return name;
    }else{
      setTimeout(getProfileName, 500);
    }

    console.log(getProfileName());
  }

  getProfileName();
`;

To error:

Error occurred in handler for 'GUEST_VIEW_MANAGER_CALL': Error: Script failed to execute, this normally means an error was thrown. Check the renderer console for the error.
    at node:electron/js2c/sandbox_bundle:2:58241
    at EventEmitter.<anonymous> (node:electron/js2c/sandbox_bundle:2:52393)
    at EventEmitter.emit (node:electron/js2c/sandbox_bundle:2:34768)
    at Object.onMessage (node:electron/js2c/sandbox_bundle:2:50471)

 

Επεξ/σία από rafinos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μου μυρίζει περισσότερο για XY problem το παραπάνω.
Έχω καιρό να ασχοληθώ με Electron αλλά θες να μας πεις περισσότερα για το τι προσπαθείς να καταφέρεις;

p.s Έχεις ένα console.log(getProfileName()); στο τέλος που καλεί ξανά την getProfileName, σε περίπτωση που σου έχει ξεφύγει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
1 ώρα πριν, Xvipes είπε

Μου μυρίζει περισσότερο για XY problem το παραπάνω.
Έχω καιρό να ασχοληθώ με Electron αλλά θες να μας πεις περισσότερα για το τι προσπαθείς να καταφέρεις;

p.s Έχεις ένα console.log(getProfileName()); στο τέλος που καλεί ξανά την getProfileName, σε περίπτωση που σου έχει ξεφύγει.

Το console.log(getProfileName()); είναι το data που επιστρέφει η 

await webview.executeJavaScript(getProfileName);

Πρακτικά είναι και η κλήση της συγκεκριμένης function. 


Αυτό που κάνω είναι login σε ένα site αυτοματοποιημένα μέσω dom. To login γίνεται (πρακτικά με το καλείται το home του site χωρίς κάποια get variable σημαίνει πως έγινε login), απλά κάποιες φορές όπως είπα μου βγάζει error όταν προσπαθεί να τρέξει η executeJavaScript. Υποθέτω δηλαδή πως είναι αυτό καθώς συνήθως αυτό το error βγάζει στο console του vscode. Δεν βρίσκω και άλλο λόγο να υπάρχει θέμα έτσι και αλλιώς

Επεξ/σία από rafinos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Διακρίνω ότι το event 'dom-ready' του webview ξεκινά να τρέχει πριν η σελίδα φορτώσει πλήρως. Μήπως θα ήταν καλύτερο να χρησιμοποιήσω κάποιο άλλο event όπως το 'did-stop-loading' ή το 'did-attach';
 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...