Les événements IE11 sur modifier
Mon code lance un IE 11 de la page, et clique sur un lien, puis tente de combler en deux listes déroulantes. Le premier est rempli avec succès avec la valeur "2012"
. Mais la deuxième n'est pas se remplie avec la valeur "TOYOTA"
.
Malgré le fait que la deuxième liste déroulante n'affiche plus la commande "select", il n'a tout simplement pas montrer "TOYOTA"
. En d'autres termes, il va de la commande "select" pour un vide. Alors que la première liste déroulante correctement va de la commande "select" pour "2012"
.
Je pensais que c'était probablement à voir avec le fait que la deuxième liste déroulante affichera des valeurs qui dépendent de la première liste déroulante de sélection proprement dite. Et que certains onchange ou fireevent de commande est nécessaire.
J'ai été la recherche d'un lot en ligne et j'ai trouvé des problèmes similaires que j'ai essayé de l'éponge sur des. En général, il y a eu deux principales variations de code que j'ai essayé. Comme toujours, je serais à fond reconnaissant si quelqu'un pouvait éventuellement d'exécuter ce code et/ou me conseiller. La première est comme ceci:
Sub GetQuote()
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate ("website")
IE.Visible = True
Do
DoEvents
Loop Until IE.readystate = 4
Dim e
Set e = IE.document.getElementsByClassname("id name of button")(1)
e.Click
Application.Wait (Now + TimeValue("00:00:02"))
Do
DoEvents
Loop Until IE.readystate = 4
Dim z As Object
Set z = IE.document.getElementbyid("vehicleYearOfManufactureList")
z.Focus
z.SelectedIndex = 4
z.FireEvent ("onchange")
Application.Wait (Now + TimeValue("00:00:02"))
Dim y As Object
Set y = IE.document.getElementbyid("vehicleMakeList")
y.Focus
y.Value = "TOYOTA"
y.FireEvent ("onchange")
End Sub
Et la deuxième, c'est comme cela:
Sub GetQuote()
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate ("website")
IE.Visible = True
Do
DoEvents
Loop Until IE.readystate = 4
Dim e
Set e = IE.document.getElementsByClassname("sg-Btn sg-Btn--primary")(1)
e.Click
Application.Wait (Now + TimeValue("00:00:02"))
Do
DoEvents
Loop Until IE.readystate = 4
Dim z As Object
Set evt = IE.document.createEvent("HTMLEvents")
evt.initEvent "change", True, False
Set z = IE.document.getElementbyid("vehicleYearOfManufactureList")
z.SelectedIndex = 4
z.dispatchEvent evt
Application.Wait (Now + TimeValue("00:00:02"))
Dim y As Object
Set evt = IE.document.createEvent("HTMLEvents")
evt.initEvent "change", True, False
Set y = IE.document.getElementbyid("vehicleMakeList")
y.Value = "TOYOTA"
y.dispatchEvent evt
End Sub
Et voici le code source pour la deuxième liste déroulante qui je veux remplir avec "TOYOTA" (une chose que j'ai remarqué quand j'ai survolé la deuxième liste déroulante est qu'au lieu d'avoir l'habitude de flèche pour mon curseur, il affiche désormais une main avec un petit cercle noir qui a une grève à travers elle, ce qui semble en ligne avec le fait que la deuxième liste déroulante qui semble ne pas pouvoir être sélectionné):
<option value="">Select</option><optgroup label="Common Makes" id="commonVehicleMakeOptionGroup"><option value="AUDI">Audi</option><option value="BMW">BMW</option><option value="FORD">Ford</option><option value="HOLDEN">Holden</option><option value="HONDA">Honda</option><option value="HYUNDAI">Hyundai</option><option value="KIA">Kia</option><option value="MAZDA">Mazda</option><option value="MERCEDES-BENZ">Mercedes-Benz</option><option value="MITSUBISHI">Mitsubishi</option><option value="NISSAN">Nissan</option><option value="SUBARU">Subaru</option><option value="TOYOTA">Toyota</option><option value="VOLKSWAGEN">Volkswagen</option><option disabled="disabled"></option></optgroup><optgroup label="All Makes" id="allVehicleMakeOptionGroup"><option value="ABARTH">Abarth</option><option value="ALFA ROMEO">Alfa Romeo</option><option value="ASTON MARTIN">Aston Martin</option><option value="AUDI">Audi</option><option value="BENTLEY">Bentley</option><option value="BMW">BMW</option><option value="CHERY">Chery</option><option value="CHRYSLER">Chrysler</option><option value="CITROEN">Citroen</option><option value="DODGE">Dodge</option><option value="FIAT">Fiat</option><option value="FORD">Ford</option><option value="FOTON">Foton</option><option value="GEELY">Geely</option><option value="GREAT WALL MOTORS">Great Wall Motors</option><option value="HOLDEN">Holden</option><option value="HONDA">Honda</option><option value="HSV">HSV</option><option value="HYUNDAI">Hyundai</option><option value="INFINITI">Infiniti</option><option value="ISUZU">Isuzu</option><option value="IVECO">Iveco</option><option value="JAGUAR">Jaguar</option><option value="JEEP">Jeep</option><option value="KIA">Kia</option><option value="LAND ROVER">Land Rover</option><option value="LEXUS">Lexus</option><option value="LOTUS">Lotus</option><option value="MAHINDRA">Mahindra</option><option value="MAZDA">Mazda</option><option value="MERCEDES-BENZ">Mercedes-Benz</option><option value="MINI">Mini</option><option value="MITSUBISHI">Mitsubishi</option><option value="NISSAN">Nissan</option><option value="OPEL">Opel</option><option value="PEUGEOT">Peugeot</option><option value="PORSCHE">Porsche</option><option value="PROTON">Proton</option><option value="RANGE ROVER">Range Rover</option><option value="RENAULT">Renault</option><option value="SAAB">Saab</option><option value="SKODA">Skoda</option><option value="SMART">Smart</option><option value="SSANGYONG">Ssangyong</option><option value="SUBARU">Subaru</option><option value="SUZUKI">Suzuki</option><option value="TATA">Tata</option><option value="TOYOTA">Toyota</option><option value="VOLKSWAGEN">Volkswagen</option><option value="VOLVO">Volvo</option></optgroup></select>
Vous devez vous connecter pour publier un commentaire.
La meilleure façon de sélectionner une option dans une liste déroulante est d'utiliser le
selectedIndex
bien ou pour définirselected = True
pour l'un des<option>
éléments. Après cela, vous pouvez mettre le feu à laonchange
vous-même. Depuis votre page utilise AJAX pour initialiser autres listes en fonction de votre sélection, vous devrez attendre qu'elle se termine avant de continuer.J'en ai eu marre et a décidé de construire ma propre voiture. Je vient de terminer la fonctionnalité nécessaire pour sélectionner une option dans la liste déroulante et feu le
onchange
événement dans unSelectOption()
fonction. Il ya probablement plus de moyens sophistiqués d'attendre jusqu'à ce que l'événement se termine (comme la vérification deie.busy
ouie.readystate
) mais je suis juste dormir pendant quelques secondes après que j'ai mis à chaque option.Je l'ai fait dans Windows Script Host, j'ai donc eu le luxe de l'aide
WScript.Sleep()
. Vous aurez juste besoin de remplacer ces appels avecApplication.Wait()
pour VBA.SelectOption = True
pour indiquer la réussite. Je ne suis pas en utilisant la valeur de retour ci-dessus, mais vous pouvez écrire:If Not SelectOption(d, "someControl", "someText") Then ...
pour effectuer une certaine opération de l'appel de la fonction a échoué, par exemple. Par défaut, toutes les variantes/boolean fonctions retournent un "falsy" valeur si vous n'avez pas explicitement défini àTrue
. Alors quand j'ai vérifier les erreurs plus tôt et faire uneExit Function
, c'est en fait le retour d'un "falsy" valeur (celle qui ferait échouer uneIf
test).initEvent
, il faut 3 params. La deuxième indique si l'événement (dans ce cas, l'événement "change") doit informer ses parents et de ses parents, etc, tout le chemin jusqu'à l'événement de la chaîne. Ce n'est pas nécessaire. Nous avons juste besoin de feu pour notre liste déroulante. Et ne vous inquiétez pas à propos de la 3ème param. Il ne joue pas un facteur ici. Pour déclencher un événement, vous devez créer un événement isolé, ce que nous faisons avec ledoc.createEvent()
fonction. Puis le définir. Ensuite, dire à un contrôle (dans ce case
, notre liste déroulante) pour le feu:e.dispatchEvent()
.SelectOption d, "vehicleYearOfManufactureList", "2012"
? Maintenant qu'une seule citation peut être automatisé, ce que je voudrais vraiment faire est de faire une boucle par un tas de profils que je veux aléatoirement sur une feuille de calcul.Range("A1").Value
, où la cellule A1 contient "33 Bull Street". Je ne suis pas sûr de la façon de le faire là où il y a une fonction de liaison qui a des chaînes de texte dans ses argumentsSelectOption
attend une chaîne de texte. Donc, vous devriez être en mesure de faire quelque chose comme:SelectOption d, "someID", Range("A1").Value
, en supposant A1 contient du texte.Où est votre URL? Ou, est-il derrière un pare-feu d'entreprise, de sorte que personne ne puisse le voir? De toute façon, votre script doit être quelque chose comme ça . . . .