Excel VBA steuert Webseiten mit Knockout- Füllt Details aus; klickt auf Speichern; scheint zu funktionieren; aber nichts ist gerettet

8

Zusammenfassung:

Grundsätzlich versuchen Sie, eine Website mit Excel VBA zu bearbeiten. Die Änderungen scheinen zu funktionieren, aber wenn ich den Speichern-Knopf benutze, wird nichts gespeichert. Ich weiß, dass die Schaltfläche zum Speichern funktioniert, wie unten beschrieben. Warum werden meine aktualisierten Daten, die auf dem Bildschirm sichtbar sind, nicht gespeichert?

Die Geschichte:

Ich habe diesen Code, an dem ich seit einiger Zeit mit Excel VBA gearbeitet habe. Es öffnet eine Webseite im Internet Explorer, navigiert, wo ich will, füllt eine Menge von Daten aus, die alle auf dem Bildschirm erscheinen, mit verschiedenen Methoden wie:

%Vor%

und

%Vor%

oder

%Vor%

All das funktioniert sehr gut und ändert sich auf dem Bildschirm. Ich klicke dann auf Speichern mit:

%Vor%

Was wieder gut funktioniert. Das Problem ist, dass es nicht wirklich meine Änderungen aus dem Code von den 3pieces oben speichert. Was ich versucht habe, ist

a) Halten Sie meinen Code an und klicken Sie auf Speichern (gleiches Problem)

b) Halten Sie meinen Code an, ändern Sie manuell ein Kontrollkästchen und führen Sie den Code zum Speichern aus (speichert die manuelle Änderung, aber nicht die codierten Zeichen

)

c) Halten Sie den Code an und ändern Sie manuell eine Box und speichern Sie sie manuell (nur die manuell geänderte Box wird gespeichert)

Von oben sieht es so aus, als ob mein "Save Click" funktioniert, aber aus irgendeinem Grund, obwohl die Boxen sichtbar verändert und mit dem Code ausgefüllt wurden, gibt es eine Lücke zwischen dem sichtbaren und dem Hintergrund.

Wie auch immer, ein bisschen HTML-Quellcode. Was Chrome zeigt, wenn ich ein Element überprüfe, das ich verändere:

%Vor%

Ich habe auch den gesamten Quellcode für die Seite durchsucht ... Ich glaube, das könnte wichtig sein, aber ich bin kein HTML-Kodierer. Ich habe es ein bisschen gekürzt

%Vor%

Da ist auch dieses ... nochmal viel länger:

%Vor%

Ich denke, der letzte hat etwas damit zu tun, und ich weiß nicht, ob ich das ändern kann.

Für die schlechten Nachrichten kann ich die Website-Adresse oder den Quellcode nicht öffentlich veröffentlichen. Aber bitte PM, und ich kann etwas ausarbeiten.

    
Bryan Davies 03.07.2016, 09:50
quelle

2 Antworten

1

Nach Ihrem Kommentar:

  

b) Halten Sie meinen Code an, ändern Sie ein Kontrollkästchen manuell und führen Sie den Code zum Speichern aus   (speichert die manuelle Änderung, aber nicht die codierten

Es scheint, dass das Problem mit den Code-Einstellungsformularsteuerelementen und nicht mit dem Code ist, der auf die Speicherschaltfläche klickt.

Dies scheint ein Problem zu sein, das nicht mit VBA zusammenhängt, sondern mit dem Verhalten von knockout - siehe dieser SO-Beitrag . Der relevante Kommentar ist:

  

Ihr Problem besteht darin, dass ko beim Click-Ereignis innerhalb der geprüften Bindung subskribiert:

Der Fragesteller in diesem Post hat ein ähnliches Problem mit Ihnen - er versucht, ein Kontrollkästchen zu aktivieren (um die Ansicht zu ändern), aktualisiert aber weder das Ansichtsmodell noch das zugrunde liegende Modell selbst . Knockout ist ein MVVM -Rahmenwerk.

Das Verschenken in Ihrer Frage besteht darin, dass Ihre manuellen Änderungen festgeschrieben werden, weil Sie beim Ausführen der Aktion per Zeigen-und-Klicken im Browser ein Klicken-und-Ändern ausführen, aber Ihre programmatische Methode nur die Änderung an dem Formular ausführt Kontrolle, aber nicht der Klick zuerst.

Also, wie löst man das via VBA-Automatisierung über IE?

Basierend auf der Lösung in der Post, die ich oben referenziert habe, plus der Methode hier Ich werde den Code unten als mögliche Lösung riskieren, aber bitte beachten Sie, es ist nicht getestet ...

Grundsätzlich müssen Sie auf das Formularelement klicken, das Sie ändern möchten - und dann den Steuerwert aktualisieren. Hoffentlich wird das "Klick" -Bit bedeuten, dass das Knockout-Viewmodel nach der "Änderung" aktualisiert wird, und von dort werden die Modelldaten in die Datenbank (oder was auch immer) geschrieben:

Ihr Kontrollkästchenbeispiel:

%Vor%

Ihr Dropdown-Beispiel:

%Vor%

Hoffe, das hilft - ziemlich das 3-Rohr-Problem! Viel Glück.

    
Robin Mackenzie 13.07.2016, 11:50
quelle
2

Da die betreffende Website nicht geteilt werden kann, kann ich eine Reihe von Tipps zum Ausprobieren finden:

Wenn die Website ein einfaches (reines) HTML-Formular zum Senden der POST-Anfrage implementieren würde, wäre Ihre Lösung in Ordnung. Aber schau dir den HTML-Code an, den du geteilt hast

%Vor%

Das data-bind weist bereits darauf hin, dass die Daten von einer Bibliothek gesammelt / gesendet werden. (Z. B. Knockout verwendet dieses Attribut). Diese Bibliothek könnte nun die Daten irgendwo sammeln und sie könnte durch ein "Klick" - oder ein "Schlüssel" -Ereignis in JavaScript ausgelöst werden. Die gesammelten Informationen können dann in einem versteckten DOM-Element gespeichert werden, wie von GCSDC vorgeschlagen oder direkt in einer JavaScript-Variablen.

Ich würde jetzt vorschlagen, herauszufinden, welches JavaScript-Framework auf dieser Seite verwendet wird, indem Sie die HTML-Quelle untersuchen. Irgendwann sollte es ein

geben %Vor%

Tag im HTML-Code, der Ihnen den Namen des Frameworks geben soll. (Es kann tatsächlich mehrere Tags dieser Art geben, einschließlich benutzerdefinierter JavaScript-Dateien. Diese Tags müssen nicht am Anfang des HTML-Dokuments stehen und können darüber verstreut sein, sodass Sie möglicherweise nach script in suchen müssen Das HTML-Dokument, von dem eines das Hauptframework sein sollte, das die Anfrage sendet. Wenn Sie nicht sicher sind, welches es wäre, müssen Sie alle googlen und herausfinden.)

Recherchieren Sie dann, wie die POST (vielleicht Ajax) Anfrage im JavaScript-Code auf dieser Seite mit Hilfe der Dokumentation des Frameworks gesendet wird. Senden Sie dann die Anfrage, indem Sie auf dieser Seite benutzerdefiniertes JavaScript von VBA ausführen. Wie das gemacht werden könnte, wird in diesem Beitrag gezeigt.

>

Alternativ können Sie versuchen, ein Klick- (oder Schlüssel-) Ereignis in den Formulareingaben auszulösen, damit das Framework davon ausgeht, dass Sie es tatsächlich eingegeben haben. Wie das gemacht werden könnte, wird in diesem Post gezeigt, aber Dies funktioniert möglicherweise nicht in allen Fällen.

    
Michael Scheffenacker 12.07.2016 10:49
quelle