English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Beaucoup de gens dans le groupe demandent, ce menu déroulant est introuvable, ce popup est introuvable... tous ces problèmes de localisation. En réalité, dans la plupart des cas, cela ne concerne que deux problèmes :1 Avec frame,2 Pas de délai d'attente. Ne saviez-vous pas que la vitesse d'exécution de votre code est de quelle magnitude, et la vitesse de chargement et de rendu du navigateur est de quelle magnitude ? C'est comme si Flash et Ultraman avaient convenu de se rendre pour combattre les monstres, puis Flash revient après l'avoir combattu et demande à Ultraman pourquoi il est encore en train de s'habiller et de ne pas être sorti. Ultraman se sent agacé en interne, pensant que Flash le méprise parce qu'il est lent, il ne joue plus avec lui et lance une exception pour abandonner la tâche.
Alors, comment pouvons-nous tenir compte du rythme de chargement lent d'Ultraman ? Il n'y a qu'une seule solution, c'est d'attendre. En parlant d'attendre, il y a trois manières d'attendre, et je vais les expliquer un par un :
1. Attente forcée
La première méthode et la plus simple et la plus brute est l'attente forcée sleep(xx), forçant Flash à attendre xx secondes, peu importe si Ultraman peut suivre le rythme ou s'il est déjà arrivé à l'avance, il doit attendre xx secondes.
Voyons le code :
# -*- coding: utf-8 -*- from selenium import webdriver from time import sleep driver = webdriver.Firefox() driver.get('https://huilansame.github.io sleep(3) # Attente forcée3secondes avant de passer à l'étape suivante print driver.current_url driver.quit()
Cela s'appelle une attente forcée, que le navigateur ait terminé de charger ou non, le programme doit attendre.3secondes,3Une fois que la seconde est écoulée, continuez à exécuter le code suivant, ce qui est très utile pour le débogage. Parfois, vous pouvez aussi attendre ainsi dans le code, mais je ne recommande pas d'utiliser ce type d'attente fréquemment, car il est trop rigide et peut sérieusement affecter la vitesse d'exécution du programme.
2. Attente cachée
La deuxième méthode est l'attente cachée, implicitly_wait(xx), le sens de l'attente cachée est : Flash et Ultraman ont convenu, peu importe où Flash va, il doit attendre Ultraman xx secondes. Si Ultraman arrive dans ce temps, ils partiront immédiatement pour combattre les monstres. Si Ultraman ne vient pas à temps, Flash part seul. Alors, naturellement, il attendra que Ultraman vous lance une exception.
Voyons le code :
# -*- coding: utf-8 -*- from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(30) # Attente cachée, attente maximale30 secondes driver.get('https://huilansame.github.io print driver.current_url driver.quit()
L'attente cachée est de définir un temps d'attente maximum. Si la page web est chargée dans le temps imparti, passez à l'étape suivante. Sinon, attendez jusqu'à ce que le temps soit écoulé et passez à l'étape suivante ensuite. Notez que cela comporte un inconvénient, c'est que le programme attendra que tout le contenu de la page soit complètement chargé, c'est-à-dire que dans la plupart des cas, vous verrez le cercle de rotation de la barre d'état du navigateur cesser de tourner avant de passer à l'étape suivante. Mais parfois, les éléments que vous souhaitez attendre sont déjà chargés, mais en raison de certaines choses comme des js particulièrement lents, je dois attendre que la page soit complètement terminée avant de passer à l'étape suivante. Comment faire pour passer à l'étape suivante une fois que l'élément que je veux est apparu ? Il y a une solution, cela dépend du mode d'attente explicite fourni par Selenium - wait.
Il convient de noter en particulier : la patience implicite joue un rôle tout au long du cycle du driver, donc il suffit de la configurer une fois. J'ai vu quelqu'un utiliser la patience implicite comme sleep, qui apparaît partout…
3. Attente explicite
La troisième méthode consiste en une attente explicite, WebDriverWait, accompagnée des méthodes until() et until_not() de la classe, ce qui permet une attente flexible en fonction des conditions de jugement. Son principal sens est : le programme regarde une fois toutes les xx secondes, si la condition est établie, l'étape suivante est exécutée, sinon, il continue d'attendre jusqu'à ce que la durée maximale définie soit dépassée, puis l'exception TimeoutException est lancée.
Regardons d'abord un exemple de code :
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.implicitly_wait(10) # La patience implicite et explicite peut être utilisée simultanément, mais attention : la durée maximale de l'attente est la plus grande des deux driver.get('https://huilansame.github.io locator = (By.LINK_TEXT, 'CSDN') try: WebDriverWait(driver, 20, 0.5).until(EC.presence_of_element_located(locator)) print driver.find_element_by_link_text('CSDN').get_attribute('href') finally: driver.close()
Dans l'exemple précédent, nous avons configuré le temps d'attente implicite et explicite, dans d'autres opérations, le temps d'attente implicite joue un rôle déterminant, dans WebDriverWait.., le temps d'attente explicite joue un rôle principal, mais il faut noter que : le temps maximum d'attente dépend du plus grand des deux, dans cet exemple, c'est}}20, si le temps d'attente implicite > que le temps d'attente explicite, alors le temps maximum d'attente du code suivant est égal au temps d'attente implicite.
Nous utilisons principalement la classe WebDriverWait et le module expected_conditions, le blogueur vous montrera en détail ces deux modules :
WebDriverWait
La classe WebDriverWait du module wait est une classe d'attente explicite, voyons quels sont ses paramètres et méthodes :
selenium.webdriver.support.wait.WebDriverWait(classe) __init__ driver: Instance WebDriver passée, c'est-à-dire le driver de notre exemple précédent timeout: Durée maximale d'attente, le temps maximum d'attente (en tenant compte également du temps d'attente implicite) poll_frequency: Intervalle de temps entre les appels de la méthode dans until ou until_not, par défaut c'est 0.5secondes ignored_exceptions: Exceptions ignorées, si cette exception du tuple est lancée pendant l'appel de until ou until_not, le code ne sera pas interrompu et continuera à attendre, si une exception en dehors de ce tuple est lancée, le code sera interrompu et l'exception sera lancée. Par défaut, il n'y a que NoSuchElementException. until method: Pendant la période d'attente, cette méthode passée est appelée à intervalles réguliers pendant un certain temps, jusqu'à ce que la valeur retournée ne soit plus False message: Si le délai d'attente est dépassé, une TimeoutException est lancée, le message est passé à l'exception until_not est l'opposé de until, until est lorsque l'élément apparaît ou que la condition est remplie pour continuer l'exécution, until_not est lorsque l'élément disparaît ou que la condition n'est pas remplie pour continuer l'exécution, les paramètres sont les mêmes, nous ne les expliquons pas encore. method message
Après avoir lu le contenu ci-dessus, vous devriez comprendre assez bien, l'appel de la méthode se fait ainsi :
WebDriverWait(driver, durée_d'attente, fréquence_d'appel, exceptions_ignoreées).until(méthode_exécutable, information_retournée_en_cas_de_délai_d'attente)
Il faut surtout noter que la méthode exécutable method dans until ou until_not, beaucoup de gens passent un objet WebElement, comme suit :
WebDriverWait(driver, 10.until(driver.find_element_by_id('kw')) # Erreur
C'est une mauvaise utilisation, les paramètres doivent être appelables, c'est-à-dire que cet objet doit avoir une méthode __call__(), sinon une exception sera lancée :
TypeError: 'xxx' object is not callable
Ici, vous pouvez utiliser diverses conditions du module expected_conditions fourni par selenium, ou les méthodes is_displayed()、is_enabled()、is_selected() de WebElement, ou les méthodes que vous avez encapsulées, alors regardons les conditions fournies par selenium :
expected_conditions
expected_conditions est un module de selenium, qui contient une série de conditions utilisables pour juger :
selenium.webdriver.support.expected_conditions(module) Ces deux conditions vérifient le title, vérifient si le paramètre entré title est égal ou contient driver.title title_is title_contains Ces deux conditions vérifient si un élément apparaît, les paramètres entrés sont tous de type tuple locator, comme (By.ID, 'kw') Comme son nom l'indique, l'une nécessite que l'élément correspondant à la condition soit chargé pour passer, et l'autre nécessite que tous les éléments correspondant à la condition soient chargés presence_of_element_located presence_of_all_elements_located Ces trois conditions vérifient si un élément est visible, les deux premiers paramètres sont de type tuple locator, le troisième est WebElement Les premiers et troisièmes sont en réalité identiques visibility_of_element_located invisibility_of_element_located visibility_of Ces deux conditions juge si un texte apparaît dans un élément, l'une juge le texte de l'élément, l'autre juge la valeur de l'élément text_to_be_present_in_element text_to_be_present_in_element_value Cette condition juge si le frame peut être intégré, peut entrer un tuple de locator ou directement entrer le mode de localisation : id, name, index ou WebElement frame_to_be_available_and_switch_to_it Cette condition juge si une alerte apparaît alert_is_present Cette condition juge si un élément est cliquable, transmet un locator element_to_be_clickable Ces quatre conditions jugent si un élément est sélectionné, la première condition transmet un objet WebElement, la deuxième transmet un tuple locator Le troisième transmet un objet WebElement et un état, retourne True s'ils sont égaux, sinon retourne False Le quatrième transmet le locator et l'état, retourne True s'ils sont égaux, sinon retourne False element_to_be_selected element_located_to_be_selected element_selection_state_to_be element_located_selection_state_to_be La dernière condition juge si un élément reste dans le DOM, transmet un objet WebElement, peut juger si la page a été rafraîchie staleness_of
Voici tous17Une condition, combinée avec until et until_not, peut réaliser de nombreuses jugements, et si elle peut être encapsulée de manière flexible, cela améliorera considérablement la stabilité du script.
Voici une explication détaillée des trois méthodes d'attente de Python selenium présentées par l'éditeur, j'espère que cela vous sera utile. Si vous avez des questions, n'hésitez pas à me laisser un message, je vous répondrai à temps. Je remercie également tous ceux qui soutiennent le site de tutoriels à cri
Déclaration : le contenu de cet article est issu du réseau, propriété de l'auteur original, le contenu est contribué et téléversé par les utilisateurs d'Internet, ce site Web ne détient pas de droits de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu susceptible de violer les droits d'auteur, veuillez envoyer un e-mail à : notice#w pour signaler, et fournir des preuves pertinentes.3Déclaration : le contenu de cet article est issu du réseau, propriété de l'auteur original, le contenu est contribué et téléversé par les utilisateurs d'Internet, ce site Web ne détient pas de droits de propriété, n'a pas été traité par l'éditeur humain et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu susceptible de violer les droits d'auteur, veuillez envoyer un e-mail à : notice#w pour signaler, et fournir des preuves pertinentes. Une fois confirmé, ce site supprimera immédiatement le contenu suspect d'atteinte aux droits d'auteur.