2017-02-01 1 views
9

Je suis en train d'automatiser certains de nos processus, l'on inclut la connexion à une page Web externe, en cliquant sur un lien pour étendre les détails, puis saisissez tous les détails affichés.grattage bouton écran contenant la page Web avec AJAX

J'ai le processus connecté, et peut saisir tous les détails une fois qu'ils sont développés.

Le problème est de cliquer sur le lien. Le lien est défini comme ci-dessous (j'ai enlevé ce que la méthode Submit ne fait que le code est long et probablement hors de propos Il est évident que l'img est l'espace réservé comme un exemple.):

<a id="form:SummarySubView:closedToggleControl" onclick="A4J.AJAX.Submit(...); return false;" href="#"> 
    <img ... /> 
</a> 

J'utilise ces données comme ci-dessous:

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    WebBrowser browser = (WebBrowser)sender; 

    HtmlElement expandDetails = browser.Document.GetElementById("form:SummarySubView:closedToggleControl"); 
    //When open ID for element is "form:SummarySubView:openToggleControl" 

    if(expandDetails == null) //If already expanded 
    { 
     //Stuff 
    } 
    else 
    { 
     expandDetails.InvokeMember("click"); //Click on element to run AJAX 
    } 
} 

Lors de l'exécution expandDetails.InvokeMember("click");browser_DocumentCompleted est appelé à nouveau comme prévu, mais le document est identique avant et expandDetails se retrouve avec l'id « fermé ». Cela signifie que les détails que je cherche ne sont jamais montrés.

Comment puis-je avoir accès au document après le script AJAX fonctionne correctement?

Ajout d'un Timer pour retarder la vérification du document ne semble pas avoir fonctionné.

Répondre

6

Donc une solution vraiment simple semble avoir fonctionné. Mon code ressemble maintenant à:

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    WebBrowser browser = (WebBrowser)sender; 

    HtmlElement expandDetails = browser.Document.GetElementById("form:SummarySubView:closedToggleControl"); 
    //When open ID for element is "form:SummarySubView:openToggleControl" 

    if(expandDetails == null) //If already expanded 
    { 
     //Stuff 
    } 
    else 
    { 
     expandDetails.InvokeMember("click"); //Click on element to run AJAX 

     while (expandDetails != null) 
     { 
      expandDetails = browser.Document.GetElementById("form:SummarySubView0:closedToggleControl"); 

      Application.DoEvents(); 
      System.Threading.Thread.Sleep(200); 
     } 

     //Stuff 
    } 
} 

Il faut donc lancer la boucle while fonctionne très bien pour mon cas.

+0

Génial! Je suis content que vous l'ayez fait fonctionner. –

1

Bon, d'abord, l'événement document.complete se déclenche pour toutes les images de la page. Donc, si vous avez 5 Iframes, vous aurez 6 événements complets.

donc vous devez vérifier si vous êtes réellement la fenêtre de haut niveau ou non. Faire cela seul peut résoudre votre problème. Si cela ne fonctionne pas, vous pouvez simplement utiliser une minuterie pour attendre quelques secondes après la fin du document.

public partial class Form1 : Form 
{ 
    Timer t; 
    public Form1() 
    { 
     InitializeComponent(); 
     webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted; 
    } 
    private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     WebBrowser wb = sender as WebBrowser; 

     //check to make sure we are on the TOP-level page. 
     if (wb.Document.Window.Parent == null) 
     { 
      t = new Timer(); 
      t.Tick += (Timersender, eventargs) => 
      { 
       //do whatever else you need to here 
       t.Stop(); 
      }; 
      t.Interval = 2000; //wait 2 seconds for the document to complete 
      t.Start(); 
     } 
    } 
} 

Vous pouvez régler la minuterie pour qu'elle soit plus longue ou plus courte si nécessaire. Mais cela devrait vous apporter ce dont vous avez besoin.

+0

Le document est donc complet avant que la fonction AJAX ne soit appliquée? Je vais essayer ... – anothershrubery

+0

Je ne sais pas quel site vous consultez. Ils peuvent le coder comme ils le veulent. Mais oui, il est très possible pour un site Web de commencer à appeler les méthodes ajax après document.complete feux en accrochant dans window.onload de javascript ou $ (document) .ready de jQuery. Ce que je dis, c'est qu'au moins vous devriez vérifier si l'événement document.complete qui est en train de tirer provient de la fenêtre de haut niveau. Et si cela ne suffit pas, vous pouvez ajouter une minuterie pour attendre quelques secondes pendant que l'autre ajax se termine. –

+0

J'ai donc ajouté un 'Timer' et ça ne semble pas fonctionner. Peu importe combien de temps je définis le 'Timer', il affiche toujours le document" pré-cliqué ". – anothershrubery