Ankündigung

Einklappen
Keine Ankündigung bisher.

CasperJS

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • CasperJS

    Hallo Leute,

    seit langem stehe ich an einem Problem wo ich leider ohne Unterstützung nicht mehr weiter komme.
    Obwohl ich das Internet extrem durchstöbert und reichlich nach Lösungsansätzen gesucht habe, komme ich mit mein Wissen nicht mehr weiter. Ich muss auch zugeben, dass ich mit CasperJS zum 1. Mal Arbeite und so gut wie keine vernünftigen Erfahrungen sammeln konnte.

    Meine Stärken lehnt sich zu PHP was leider für mein Vorhaben nicht angebracht ist, eher wohl aber CasperJS - laut der Empfehlung aus diesem Forum hier.
    Mein Vorhaben ist rein private und daher habe ich die Zeit nur nach der Arbeit und ist nichts Kommerzielles.

    Zu mein Vorhaben:
    Ich habe private ein paar Marken. Zwischendurch muss ich diese Marken auf der DPMA-Internetseite Verwalten / Analyse etc. treiben.
    Auf Dauer ist mir dies sehr umständlich (-geworden).

    Daher habe ich gedacht, dass ich ein Script schreibe, was mir die Arbeit etwas erleichtert.
    Zuerst hatte ich es über PHP-CURL versucht, womit ich auf das falsche Pferd gesetzt hatte.
    Laut der Empfehlung versuche ich es schon etwas längerem - mit reichlich verschiedenen Lösungsansätzen (Beispiele aus dem Internet) mit CasperJS zu lösen aber es funktioniert nicht.
    Das Problem ist / liegt wahrscheinlich daran, dass die Seite POST-Anfragen über SSL verschickt.

    Hier mein letzter Ansatz:
    PHP-Code:
    var casper = require('casper').create({
        
    pageSettings: {
    //        webSecurityEnabled: true,
            
    userAgentnavigator.userAgent,
            
    loadImagesfalse,
            
    loadPluginsfalse
        
    },
        
    waitTimeout10000,
        
    stepTimeout10000,
        
    logLevel"info",
        
    verbosetrue,
        
    onWaitTimeout: function() {
            
    this.echo('*** Wait-TimeOut ***');
        },
        
    onStepTimeout: function() {
            
    this.echo('*** Step-TimeOut ***');
        }
    });
    var 
    utils = require('utils');
    var 
    links = [];
    var 
    url 'https://register.dpma.de/DPMAregister/marke/einsteiger';
    var 
    selector 'form[action="' url[1] + '"]';
    var 
    = require('casper').selectXPath;


    function 
    getLinks() {
    //    var link = document.querySelectorAll(x('//*[@id="trefferliste"]/tbody/tr/td/a'));
        
    var items = [];
        
    items document.querySelectorAll('#trefferliste a');
        return Array.
    prototype.map.call(items, function(e) {
            return 
    e.getAttribute('href');
        });
    }

    casper.start(url, function() {
        if(
    this.cli.args == "") {
            
    this.echo("Bitte geben Sie die Suchende Marke ein!");
            
    this.exit(1);
        } else {
            
    // funktioniert nicht, weshalb auch immer!
            //this.sendKeys("#wm", this.cli.args);
            
    this.sendKeys("#wm""Adidas");

            
    this.echo("1. Abschnitt\nMarke = " this.cli.args);
            
    this.capture("1_Abschnitt.png");
        }
    });

    casper.thenClick("#rechercheStarten", function() {
        
    this.echo("2. Abschnitt startet");
        
    this.capture("2_Abschnitt.png");

    });

    casper.then(function() {
        
    //    links = this.evaluate(getLinks);
        
    links this.evaluate(function() {
            var 
    items = [];
            $.
    each($("#trefferliste a"), function(xy) {
                
    items.push({
                    
    title: $(y).text(),
                    
    link: $(y).attr("href")
                });
            });
            return 
    items;
        });
        
    this.echo("Ausgabe: ");
        
    utils.dump(links);
    });

    casper.run(); 
    Ich habe an den Abschnitten jeweils 2 Screenshots machen lassen.
    Anhand diese 2 Bilder, sehe ich, dass ich den Ziel erreicht habe. Jedoch kann ich mir aber die Link-Adressen aus der Trefferliste nicht ausgeben lassen.

    Wo liegt denn eigentlich mein Problem?
    Ich bitte um Hilfe und Unterstützung.

    MfG
    Daniel

    PS:
    Ich habe hier fiktive als Beispiel nach der Marke "Adidas" gesucht. Die Marke selbst ist hier unwichtig.

  • #2
    Wo kommt die Variable $ her?

    Kommentar


    • #3
      Zitat von hellbringer Beitrag anzeigen
      Wo kommt die Variable $ her?
      Ahhh misst, stimmt, danke für den Hinweis - ist mir gar nicht aufgefallen.
      Das kommt eigentlich aus jQeury aber die muss ich ja vorher einbinden.

      Wie könnte ich jQuery am besten einbinden?
      Kannst du mir sagen, warum diese Funktion nicht geht?
      Code:
      //    links = this.evaluate(getLinks);
      Das war auch der Grund, warum ich mit "$.each" arbeiten wollte.

      MfG
      Daniel

      Kommentar


      • #4
        https://www.php.de/forum/webentwickl...13#post1517313

        hier hast du mit casper angefangen, mit dem selben Problem;
        es wäre nett gewesen das zu verlinken.

        Kommentar


        • #5
          Zitat von tomBuilder Beitrag anzeigen
          https://www.php.de/forum/webentwickl...13#post1517313

          hier hast du mit casper angefangen, mit dem selben Problem;
          es wäre nett gewesen das zu verlinken.
          Das ist soweit richtig allerdings ist der Thread geschlossen und um Inhaltlich keine Verwirrung zu bereiten, habe ich es nicht für nötig gehalten.
          Ein neuer Thread, ein neues Anfang / Start!

          MfG
          Daniel

          Kommentar


          • #6
            Juhuuuu, ich habe es geschafft.
            Allerdings hänge ich an einem sehr simplen andere Problem. Vielleicht könnt ihr mir dabei helfen.

            Ich möchte einfach überprüfen ob ein Wert im Array vorhanden ist oder nicht.

            PHP-Code:
            Array.prototype.inArray(needle) {
                try {
                    for (var 
            i in this) {
                        if(
            this[i] === needle)
                            return 
            true;
                    }
                } catch(
            e) {
                    if(
            window.console)
                        
            console.log("Error: " e);
                }
                return 
            false;
            }


            ----
            ----

                    var 
            tHeader = [
                        
            "Datenbestand",
                        
            "Aktenzeichen/Registernummer",
                        
            "Wiedergabe der Marke",
                        
            "Aktenzustand"
                    
            ];

                    $.
            each($("#trefferliste a"), function(xy) {
                        if(
            tHeader.inArray(String($(y).text()) == false) {
                            
            items.push({
                                
            title"[" "] " + $(y).text().replace(/(\r\n|\n|\r)/gm,""),
                                
            link: $(y).attr("href")
                            });
                        }
                    });

            ----
            ---- 
            Was habe ich hierbei übersehen?
            Wieso funktioniert in der IF-Anweisung die Funktion "inArray" nicht?

            Hat jemand vielleicht eine andere Idee, wie ich im Array etwas vergleichen / auf vorhanden sein überprüfen kann?

            Bitte um Hilfe!

            MfG
            Daniel

            Kommentar


            • #7
              Weil die inArray Deklaration syntaktisch fehlerhaft ist. Du müsstest dem Parser schon mitteilen ob Du eine Funktion haben möchtest.

              Wenn Du eh mit jQuery arbeitest benutze doch $.inArray()...

              Kommentar


              • #8
                Zitat von kaminbausatz Beitrag anzeigen
                Weil die inArray Deklaration syntaktisch fehlerhaft ist. Du müsstest dem Parser schon mitteilen ob Du eine Funktion haben möchtest.

                Wenn Du eh mit jQuery arbeitest benutze doch $.inArray()...

                Ich habe es mir schon gedacht, dass da etwas falsch ist.
                Wie könnte ich dennn dem Parser mitteilen, dass ich eine Funktion haben möchte?

                Das mit $.inArray() ... schaue ich mir mal an.

                Danke für die Hilfe.

                MfG
                Daniel

                Kommentar


                • #9
                  HTML-Code:
                  Array.prototype.myFind = function(arg1)
                  {
                       return this.indexOf(arg1);
                  }
                  console.log(["aa","bb","cc","dd"].myFind('xx'));  

                  Kommentar


                  • #10
                    Zitat von kaminbausatz Beitrag anzeigen
                    HTML-Code:
                    Array.prototype.myFind = function(arg1)
                    {
                    return this.indexOf(arg1);
                    }
                    console.log(["aa","bb","cc","dd"].myFind('xx'));
                    Hm ist zwar nicht schlecht aber da bekomme ich entweder 0 oder -1 raus.
                    Gibt es da denn noch bessere Lösung, wo ich etwa ein Boolean Wert bekommen kann?

                    MfG
                    Daniel

                    Kommentar


                    • #11
                      Zitat von kaminbausatz Beitrag anzeigen
                      HTML-Code:
                      Array.prototype.myFind = function(arg1)
                      {
                      return this.indexOf(arg1);
                      }
                      console.log(["aa","bb","cc","dd"].myFind('xx'));

                      Es ist echt komisch, da dieser Beispiel außerhalb "casper" funktioniert aber im "casper" wiederum nicht.

                      PHP-Code:

                      Array.prototype.inArray2 = function(args) {
                          for(var 
                      i in this) {
                              if(
                      this[i] === args)
                                  return 
                      true;
                          }
                          return 
                      false;
                      }

                              var 
                      tHeader = [
                                  
                      "Datenbestand",
                                  
                      "Aktenzeichen/Registernummer",
                                  
                      "Wiedergabe der Marke",
                                  
                      "Aktenzustand"
                              
                      ];

                      console.log(tHeader.inArray2("Aktenzustand")) // Diese Zeile funktioniert und liefert "true" zurück

                              
                      $.each($("#trefferliste a"), function(xy) {

                                  if(
                      tHeader.inArray2($(y).text()) == false) { // Diese Zeile funktioniert nicht
                                      
                      items.push({
                                          
                      title"[" "] " + $(y).text().replace(/(\r\n|\n|\r)/gm,""),
                                          
                      link: $(y).attr("href")
                                      });
                                  }
                              }); 
                      Wo ist da der Unterschied und wieso funktioniert das nicht in der IF-Anweisung?

                      MfG
                      Daniel

                      Kommentar


                      • #12
                        Kann jemand das bei sich Testen und mir den Unterschied oder den Grund nennen und ggf. auch dafür die Lösung?
                        Bedanke mich im Voraus.

                        MfG
                        Daniel

                        Kommentar


                        • #13
                          Zitat von Crashbreaker Beitrag anzeigen

                          Hm ist zwar nicht schlecht aber da bekomme ich entweder 0 oder -1 raus.
                          Gibt es da denn noch bessere Lösung, wo ich etwa ein Boolean Wert bekommen kann?

                          MfG
                          Daniel
                          Das sollte Dir ja auch nur zeigen wie man das mit der Funktion erledigt. True oder false bekommst Du bspw. wie folgt:

                          Code:
                          Array.prototype.myFind = function(arg1)
                          {
                               return this.indexOf(arg1) == -1 ? false : true;
                          }
                          console.log(["aa","bb","cc","dd"].myFind('xx'));
                          Zu den anderen Fragen solltest Du Dich mit dem Unterschied von Nodelist und Array beschäftigen.

                          Kommentar


                          • #14
                            Zitat von kaminbausatz Beitrag anzeigen

                            Das sollte Dir ja auch nur zeigen wie man das mit der Funktion erledigt. True oder false bekommst Du bspw. wie folgt:

                            Code:
                            Array.prototype.myFind = function(arg1)
                            {
                            return this.indexOf(arg1) == -1 ? false : true;
                            }
                            console.log(["aa","bb","cc","dd"].myFind('xx'));
                            Zu den anderen Fragen solltest Du Dich mit dem Unterschied von Nodelist und Array beschäftigen.

                            Warum ist -1 false, statt nicht die 0?
                            Habe ich da einen Denkfehler?

                            Also diese Zeile hier:

                            PHP-Code:
                            if($.inArray($(y).text(), tHeader) == false) { 
                            liefert mir nur einen Wert.

                            Mein Vorhaben ist aber, dass ich alle Zeilen auslese außer die, die im Array vorkommt.

                            Ich werde mir die Unterschiede von Nodelist und Array anschauen.
                            Ich wäre dir aber dankbar, wenn du mir bei der Lösung helfen könntest?
                            So würde ich nicht Tagelang im Internet rumsuchen.

                            MfG
                            Daniel

                            Kommentar


                            • #15
                              Was ich gar nicht verstehen kann ist, wenn "tHeader" ein reines Array ist und "$(y).text()" mir ein reines String liefert, warum sollte ich dann die Unterschiede zwischen Nodelist und Array mir anschauen?
                              Array hat gegenüber Nodelist mehr Methoden etc.

                              Ich möchte bei jedem durchlauf (in der Zeile: "$.each($("#trefferliste a"), function(x, y) {" ) prüfen ob der gesuchte String im Array vorhanden ist oder nicht.

                              Bitte um Erläuterung und Hilfe.

                              MfG
                              Daniel

                              Kommentar

                              Lädt...
                              X