2017-08-25 4 views
0

Lorsque je tente de cliquer sur un élément programme d'entrée (type = « file »), ChooseFileDialogWindow ne semble pas. Le même problème peut être recréé sur http://imgbb.com/ en essayant de cliquer sur «Démarrer le téléchargement». Sur ce site Web Cela fonctionne uniquement avec SimulateMouseButtonEvent, sur www.cs.tut.fi cela ne fonctionne pas.En cliquant sur l'élément d'entrée (FileUpload)

Lors de la définition des valeurs des éléments y est 1-2 secondes de retard jusqu'à ce que le processus passe à l'élément suivant. Dans IE, cela sera exécuté instantanément. Est-ce fait sur un porpuse lorsque le navigateur se concentre sur l'élément? Y a-t'il une manière de le désactiver?

browser.LoadURL("http://www.cs.tut.fi/~jkorpela/forms/file.html"); 

browserView.Browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e) 
{ 
    if (e.IsMainFrame) 
    { 
    Browser myBrowser = e.Browser; 
    DOMDocument document = myBrowser.GetDocument(); 

        foreach (DOMElement el in document.GetElementsByTagName("input")) 
        { 
         if (el.GetAttribute("name") == "datafile") 
         { 
          el.Focus(); 
          el.Click(); 
         } 
        } 
    } 
}; 

Répondre

1

Prenez en compte que vous ne pouvez pas faire un clic par la méthode Click() sur l'objet FileUpload en raison de la restriction de sécurité:

Si l'algorithme n'est pas déclenché par l'activation d'utilisateur, puis abandonner ces étapes sans rien faire d'autre.

Cette spécification contient plus d'informations sur l'algorithme FileUpload: https://html.spec.whatwg.org/multipage/input.html#file-upload-state-(type=file)

Voici un exemple de code qui montre comment travailler avec l'entrée fileUpload objet sur www.cs.tut.fi:

browserView.Browser.FinishLoadingFrameEvent += delegate (object sender, FinishLoadingEventArgs e) 
{ 
    if (e.IsMainFrame) 
    { 
     Browser myBrowser = e.Browser; 
     DOMDocument document = myBrowser.GetDocument(); 

     foreach (DOMElement el in document.GetElementsByName("datafile")) 
     { 
      el.Focus(); 
      System.Drawing.Rectangle rect = el.BoundingClientRect; 
      Dispatcher.Invoke(() => 
      { 
       browserView.InputSimulator.SimulateMouseButtonEvent(MouseButton.Left, 
            MouseButtonState.Pressed, 1, 
            rect.Left + (el.ClientWidth/2), 
            rect.Top + (el.ClientHeight/2)); 
       Thread.Sleep(50); 

       browserView.InputSimulator.SimulateMouseButtonEvent(MouseButton.Left, 
            MouseButtonState.Released, 1, 
            rect.Left + (el.ClientWidth/2), 
            rect.Top + (el.ClientHeight/2)); 
      }); 
     } 
    } 
}; 
browserView.Browser.LoadURL("https://www.cs.tut.fi/~jkorpela/forms/file.html"); 

Je ne peux pas détecter de retard avec votre ou mes échantillons de code.

+0

Merci pour la clarification et l'exemple de code. Existe-t-il un moyen d'obtenir le frameId d'un IFRAME sans utiliser myBrowser.GetFramesIds()? parce que quand j'utilise GetFramesIds() je reçois seulement le frameId mais je ne sais pas quel IFRAME lui correspond. J'exagérais avec le retard de 1-2 secondes, mais il y a un délai lors de la définition des valeurs aux éléments. Pour voir le retard, vous pouvez créer une minuterie avec un intervalle de 2 secondes et dans l'événement Timer_Elapsed, vous pouvez définir la valeur pour ex. 8 éléments d'entrée. Ce n'est pas un problème. – Samuel

+0

Exemple de code: https://pastebin.com/PPQ8kQh8 – Samuel

+0

Vous pouvez utiliser la propriété FrameId de FinishLoadingEventArgs pour savoir quel cadre a été chargé. J'ai reproduit le problème décrit avec un retard. Il sera corrigé dans l'une des prochaines versions. –