Com esperar que es carregui una pàgina amb seleni

How Wait Page Load With Selenium



Tot i que l'automatització web o el rascat web amb el controlador web Selenium, és possible que tingueu problemes com que l'element que voleu seleccionar no estigui disponible o que el botó que vulgueu prémer no estigui a punt per fer-hi clic, etc.

La raó per la qual això passa és que el controlador web de Selenium ha de descarregar la pàgina web i acabar de representar la pàgina abans de fer-hi res. En el passat, el servidor web generava el contingut d’un lloc web i el navegador només el baixava i el representava. Actualment tenim moltes aplicacions web d’una sola pàgina que funcionen una mica de manera diferent. A les aplicacions web d’una sola pàgina (SPAs), el servidor web només serveix els codis d’interfície. Una vegada que el codi de la interfície es representa al navegador, el codi de la interfície utilitza AJAX per sol·licitar dades de l'API al servidor web. Un cop el frontend rep les dades de l'API, les reprodueix al navegador. Per tant, tot i que el navegador ha acabat de baixar i representar la pàgina web, la pàgina web encara no està preparada. Heu d’esperar que rebi les dades de l’API i també les renderitzi. Per tant, la solució a aquest problema és esperar a que les dades estiguin disponibles abans de fer res amb Selenium.







A Seleni, hi ha 2 tipus d’espera:
1) Espera implícita
2) Espera explícita



1) Espera implícita: Aquest és el més fàcil d’implementar. Una espera implícita indica al controlador web de Selenium que espereu uns quants segons perquè el DOM (model d’objecte de document) estigui a punt (la pàgina web estigui llesta).



2) Espera explícita: Això és una mica complex que l’espera implícita. En espera explícita, indiqueu al controlador web de Selenium què ha d’esperar. El seleni espera que es compleixi aquesta condició específica. Un cop es compleixi, el controlador web de Selenium estarà a punt per prendre altres ordres. Normalment, el temps d’espera explícit és variable. Depèn de la rapidesa amb què es compleixin les condicions. En el pitjor dels casos, l’espera explícita s’esperarà sempre que l’espera implícita.





En aquest article, us mostraré com esperar (implícit i explícitament) que es carregui una pàgina amb Selenium. Per tant, comencem.

Requisits previs:

Per provar les ordres i exemples d’aquest article, heu de tenir:



1) Una distribució Linux (preferiblement Ubuntu) instal·lada al vostre ordinador.
2) Python 3 instal·lat a l'ordinador.
3) PIP 3 instal·lat al vostre ordinador.
4) Python virtualenv paquet instal·lat a l'ordinador.
5) Els navegadors web Mozilla Firefox o Google Chrome instal·lats a l’ordinador.
6) Heu de saber instal·lar el controlador Firefox Gecko o el controlador web Chrome.

Per complir els requisits 4, 5 i 6, llegiu el meu article Introducció al Seleni amb Python 3 a Linuxhint.com.

Podeu trobar molts articles sobre els altres temes a LinuxHint.com . Comproveu-los si necessiteu ajuda.

Configuració d'un directori de projectes:

Per mantenir-ho tot organitzat, creeu un directori de projectes nou espera de seleni / com segueix:

$mkdir -pvesperar seleni/conductors

Aneu a espera de seleni / directori del projecte de la següent manera:

$cdesperar seleni/

Creeu un entorn virtual Python al directori del projecte de la manera següent:

$virtualenv .venv

Activeu l'entorn virtual de la següent manera:

$font.venv/sóc/activar

Instal·leu Selenium mitjançant PIP3 de la següent manera:

$ pip3 instal·la seleni

Descarregueu i instal·leu tots els controladors web necessaris a conductors / directori del projecte. He explicat el procés de descàrrega i instal·lació de controladors web al meu article Introducció al Seleni amb Python 3 . Si necessiteu ajuda, cerqueu a LinuxHint.com per a aquest article.

Utilitzaré el navegador web Google Chrome per a la demostració d’aquest article. Per tant, faré servir el fitxer riu cromat binari des de conductors / directori.

Per experimentar amb l'espera implícita, creeu un nou script Python ex01.py al directori del projecte i escriviu les línies de codis següents en aquest fitxer.

des deseleniimportaciócontrolador web
des deseleni.controlador web.comú.claus importacióClaus
opcions=controlador web.Opcions de Chrome()
opcions.sense cap = És cert
navegador=controlador web.Chrome(ruta_executable='./drivers/chromedriver',opcions=opcions)
navegador.esperar implícitament(10)
navegador.aconseguir('Https://www.unixtimestamp.com/')
marca de temps=navegador.find_element_by_xpath('// h3 [@] [1]')
imprimir('Marca de temps actual:% s'%(marca de temps.text.dividir('')[0]))
navegador.Tanca()

Un cop hàgiu acabat, deseu el fitxer ex01.py Script Python.

Les línies 1 i 2 importen tots els components de seleni necessaris.

La línia 4 crea un objecte Opcions de Chrome.

La línia 5 habilita el mode sense cap per al controlador web de Chrome.

La línia 7 crea un objecte del navegador Chrome mitjançant el fitxer riu cromat binari des de conductors / directori.

La línia 8 s'utilitza per dir a Selenium que espereu implícitament 10 segons mitjançant el fitxer implicitly_wait () mètode del navegador.

La línia 10 carrega www.unixtimestamp.com al navegador.

La línia 12 troba l'element de marca de temps mitjançant el selector XPath // h3 [@ class = ’text-danger’] [1] i el guarda a marca de temps variable.

He obtingut el selector XPath de l'eina per a desenvolupadors de Chrome. Com podeu veure, la marca de temps és la primera h3 element amb el nom de la classe text-perill . N’hi ha 2 h3 elements amb la classe text-perill .

La línia 13 imprimeix només la marca de temps de l'element que he seleccionat mitjançant el selector XPath i emmagatzemat a la marca de temps variable.

La línia 14 tanca el navegador.

Un cop hàgiu acabat, executeu l'script de Python ex01.py com segueix:

$ python3 ex01.py

Com podeu veure, la marca de temps actual s’extreu de unixtimestamp.com i s’imprimeix a la consola.

Treballar amb Espera explícita:

Per experimentar amb l'espera explícita, creeu un nou script Python ex02.py al directori del projecte i escriviu les línies de codis següents en aquest fitxer.

des deseleniimportaciócontrolador web
des deseleni.controlador web.comú.claus importacióClaus
des deseleni.controlador web.comú.per importacióPer
des deseleni.controlador web.suport.ceba importacióWebDriverWait
des deseleni.controlador web.suport importaciócondicions_esperades
opcions=controlador web.Opcions de Chrome()
opcions.sense cap = És cert
navegador=controlador web.Chrome(ruta_executable='./drivers/chromedriver',opcions=opcions)
navegador.aconseguir('Https://www.unixtimestamp.com/')
provar:
marca de temps=WebDriverWait(navegador, 10).fins(
condicions_esperades.presència_de_element_ubicat((Per.XPATH, '
// h3 [@] [1] '
))
)
imprimir('Marca de temps actual:% s'%(marca de temps.text.dividir('')[0]))
finalment:
navegador.Tanca()

Un cop hàgiu acabat, deseu el fitxer ex02.py Script Python.

La línia 1-5 importa tots els components necessaris de la biblioteca Selenium.

La línia 7 crea un objecte Opcions de Chrome.

La línia 8 habilita el mode sense cap per al controlador web de Chrome.

La línia 10 crea un objecte del navegador Chrome mitjançant el fitxer riu cromat binari des de conductors / directori.

La línia 12 carrega www.unixtimestamp.com al navegador.

L’espera explícita s’implementa al bloc try-finalment (de la línia 14-20)

La línia 15-17 utilitza crea WebDriverWait () objecte. El primer argument de WebDriverWait () és l'objecte del navegador i el segon argument és el temps màxim permès (pitjor dels casos) per complir la condició, que és de 10 segons en aquest cas.

A la fins () bloc, expected_conditions.presence_of_element_located () s'utilitza per assegurar-se que l'element és present abans d'intentar seleccionar-lo. Aquí, Per.XPATH s'utilitza per explicar el presència_element_locat () mètode que hem utilitzat un selector XPath per seleccionar l'element. El selector XPath és // h3 [@ class = ’text-danger’] [1] .

Un cop es troba l'element, s'emmagatzema a la carpeta marca de temps variable.

La línia 18 imprimeix només la marca de temps de l'element seleccionat.

Finalment, la línia 19-20 tanca el navegador.

Un cop hàgiu acabat, executeu el fitxer ex02.py Script Python de la següent manera:

$ python3 ex02.py

Com podeu veure, la marca de temps actual de unixtimestamp.com s’imprimeix a la consola.

Selecció d'elements en espera explícita:

A la secció anterior, he utilitzat Per.XPATH per seleccionar l'element mitjançant el selector XPath. També podeu seleccionar els elements mitjançant ID, nom d’etiqueta, nom de classe CSS, selector CSS, etc.

Els mètodes de selecció admesos es donen a continuació:

Per.XPATH - Selecciona elements / elements mitjançant el selector XPath.

Per.CLASS_NAME - Selecciona elements / elements mitjançant el nom de classe CSS.

Per. CSS_SELECTOR - Selecciona elements / elements mitjançant el selector CSS.

By.ID - Selecciona l'element per identificador

By.NAME - Selecciona els elements per nom.

Per.TAG_NAME - Selecciona elements / elements pel nom de l'etiqueta HTML.

Per.LINK_TEXT - Selecciona elements o elements mitjançant el text de l'enllaç de a (ancoratge) etiqueta HTML.

Per.PARTIAL_LINK_TEXT - Selecciona elements o elements mitjançant un text d'enllaç parcial de a (ancoratge) etiqueta HTML.

Per obtenir més informació al respecte, visiteu Pàgina de documentació de l'API Python Selenium .

Condicions previstes en esperes explícites:

A l'exemple d'espera explícita anterior, he utilitzat el fitxer presència_element_locat () mètode de condicions_esperades com a condició d’espera explícita per assegurar-me que existeix l’element que cercava abans de seleccionar-lo.

N’hi ha d’altres condicions_esperades es pot utilitzar com a condició d'espera explícita. Alguns d’ells són:

title_is (títol) - comprova si el títol de la pàgina és títol .

title_contains (partial_title) - comprova si el títol de la pàgina conté una part del títol títol_parcial .

visibilitat_de (element) - comprova si el fitxer element és visible a la pàgina on l'element té una amplada i una alçada superiors a 0.

visible_of_element_located (localitzador) -

presenza_element_locat (localitzador) - Assegureu-vos que l'element situat (pel fitxer localitzador ) és present a la pàgina. El localitzador és una tupla de (Per, selector), tal com he demostrat en l'exemple explícit d'espera.

presents_of_all_element_located () - Assegura que tots els elements coincidents amb el fitxer localitzador és present a la pàgina. El localitzador és un (Per, selector) tupla.

text_per_és_presentar_en_element (localitzador, text) - Comprova si el fitxer text està present en l'element situat per la localitzador . El localitzador és un (Per, selector) tupla.

element_per_be_clickable (localitzador) - Comprova si l'element situat al fitxer localitzador és visible i es pot fer clic. El localitzador és un (Per, selector) tupla.

element_per_ser_seleccionat (localitzador) - Comprova si l'element situat al fitxer localitzador està seleccionat. El localitzador és un (Per, selector) tupla.

alert_is_present () - espereu que hi hagi un diàleg d'alerta a la pàgina.

N’hi ha molts més condicions_esperades disponible per utilitzar-lo. Per obtenir més informació al respecte, visiteu Pàgina de documentació de l'API Python Selenium .

Conclusió:

En aquest article, he comentat les esperes implícites i explícites de Selenium. També us he mostrat com podeu treballar amb una espera implícita i explícita. Sempre heu d’intentar fer servir esperes explícites als vostres projectes de Selenium, ja que Selenium intentarà reduir el temps d’espera al màxim. D’aquesta manera, no haureu d’esperar un nombre específic de segons cada vegada que executeu els vostres projectes de Selenium. L’espera explícita hauria d’estalviar molts segons.

Per obtenir més informació sobre les seleccions esperades, visiteu la biblioteca oficial Selenium Python espera la pàgina de documentació .