Peut powershell attendre jusqu'à ce que IE est DOM prêt?
Je suis en train d'écrire un script et je suis en utilisant
while($IE.busy) {Start-Sleep 1}
à attendre que la page soit prêt.
Une fois que la page est prête mon script remplit et soumet un formulaire. J'ai eu des problèmes à cause (je pense) c'est à dire les rapports qu'il est fait lorsque la page est chargée, mais avant que le document a été rendu (ce qui provoque le script à l'erreur). Ma solution actuelle est d'ajouter 4 secondes de temps d'attente après le chargement de la page, mais je me sentirais plus à l'aise avec une méthode qui n'est pas de base de temps si possible.
Je vais supposer que vous êtes à l'aide de la
Correct, je suis à l'aide de l'IE de l'objet COM. Donc je suppose que l'augmentation de l'attente pour une fois que je pense est fort c'est la seule option?
Pour autant que je sais, ouais basé sur le temps de vérification est votre meilleur pari. Si, après une certaine période de temps (par exemple. 5 minutes), vous souhaitez arrêter la recherche, vous pouvez utiliser un
Attendez, vous dites que je suis en mesure de vérifier si le DOM est prêt? Droit maintenant, je ne suis pas du tout de vérification. Je suis en attente jusqu'à ce que IE n'est pas occupé (ce qui, je pense seulement capte l'activité du réseau), puis essayer d'attendre une quantité sûre de temps avant que je commence l'interaction avec le DOM. Suis-je en mesure de vérifier si le DOM est prêt avant d'avoir des relations avec elle? Je suis très bien avec cette mise sur une minuterie. Mon problème était que je ne savais pas que je pouvais encore le vérifier, le code que j'ai eu sur un timer, c'est le code qui interagit avec la page (remplit un formulaire) et, évidemment, échoue si le DOM n'est pas encore prête.
Excuses - le précédent commentaire a été posté à la hâte, et est incomplète. Une fois que j'ai le innerHtml, je puis l'analyser à la recherche d'un élément particulier qui n'est présent que lorsque la page est affichée. Une fois trouvé, je sais que la page est entièrement chargée. Salissant, mais il a été fiable jusqu'à présent. Je ne vois pas d'autre moyen que IE "savent" quand la page a été complètement rendu.
InternetExlporer.Application
objet COM? Si oui, vous ne serez probablement pas en mesure de souscrire à des événements, parce que ce n'est pas un .NETTE de l'objet. Si c'était un .NET de l'objet, vous pouvez utiliser Register-ObjectEvent
raccorder un gestionnaire d'événement.Correct, je suis à l'aide de l'IE de l'objet COM. Donc je suppose que l'augmentation de l'attente pour une fois que je pense est fort c'est la seule option?
Pour autant que je sais, ouais basé sur le temps de vérification est votre meilleur pari. Si, après une certaine période de temps (par exemple. 5 minutes), vous souhaitez arrêter la recherche, vous pouvez utiliser un
break
déclaration à l'intérieur de la while
boucle.Attendez, vous dites que je suis en mesure de vérifier si le DOM est prêt? Droit maintenant, je ne suis pas du tout de vérification. Je suis en attente jusqu'à ce que IE n'est pas occupé (ce qui, je pense seulement capte l'activité du réseau), puis essayer d'attendre une quantité sûre de temps avant que je commence l'interaction avec le DOM. Suis-je en mesure de vérifier si le DOM est prêt avant d'avoir des relations avec elle? Je suis très bien avec cette mise sur une minuterie. Mon problème était que je ne savais pas que je pouvais encore le vérifier, le code que j'ai eu sur un timer, c'est le code qui interagit avec la page (remplit un formulaire) et, évidemment, échoue si le DOM n'est pas encore prête.
Excuses - le précédent commentaire a été posté à la hâte, et est incomplète. Une fois que j'ai le innerHtml, je puis l'analyser à la recherche d'un élément particulier qui n'est présent que lorsque la page est affichée. Une fois trouvé, je sais que la page est entièrement chargée. Salissant, mais il a été fiable jusqu'à présent. Je ne vois pas d'autre moyen que IE "savent" quand la page a été complètement rendu.
OriginalL'auteur George Kendros | 2014-03-19
Vous devez vous connecter pour publier un commentaire.
Voici comment je le fais.
Étape 1 - Identifier un élément de la page web qui apparaît seulement une fois que la page est entièrement affiché. Je l'ai fait en utilisant les outils de développement Chrome 'Éléments' vue qui montre la vue DOM.
Étape 2 - Établir une boucle d'attente dans le script qui les sondages en faveur de l'existence de l'élément ou de la valeur de texte à l'intérieur de cet élément.
OriginalL'auteur andyb
J'ai trouvé ce fil vraiment utile et fini avec un peu différente de la solution. Je suis assez nouveau à powershell, alors j'espère que je n'ai pas fait un hachage de cela, mais cela a très bien fonctionné pour moi.
J'ai utilisé un "tout" instruction afin que ma condition de la boucle while true:
Dans ce cas, j'ai été correspondant à l'encontre d'une partie de la "outerHTML" partie du corps. Tant que je ne correspond pas au texte spécifié le script va attendre et de continuer à boucle le match vérifier.
J'aime cette solution comme j'ai pu le faire plus ou moins une ligne de code et je tiens à garder les choses compact lorsque cela est possible. Espérons que cela est utile à quelqu'un d'autre. Comme l'OP j'ai trouvé c'est à dire.readystate être très compliqué,/fiables, mais je n'avais vraiment pas envie de mettre une statique de la minuterie de mise en sommeil.
Aussi, tandis que le Chrome est un excellent moyen de briser une page vers le bas. Vous pouvez également imprimer à la fenêtre de la console une fois que vous avez IE cours d'exécution par programme tout simplement en cours d'exécution:
Vous pouvez creuser à travers visuellement et puis le filtre vers le bas à la section que vous voulez qui devrait accélérer la vitesse de votre correspondant (je suppose), qui est ce que j'ai fait dans mon exemple de code ci-dessus.
La seule autre chose que je note... je pense que le match utilise "regex" parce que j'ai eu à utiliser la coche (ex. ` ) pour échapper les guillemets qui faisaient partie de la chaîne, j'ai été correspondant.
Cheers!
Ici est une bonne référence dans le "tout" de la logique:
http://www.powershellpro.com/powershell-tutorial-introduction/logic-using-loops/
OriginalL'auteur Nathan Beam