0
votes

Comment garder les éléments de la page d'origine avec sélénium après ouverture d'un lien généré par JavaScript et revenant à la page d'origine

Il semble impossible ou très compliqué de conserver les éléments d'origine dans le WebDriver de sélénium après avoir déplacé une autre page via un lien généré par JavaScript. Comment puis-je faire cela?

J'essaie de faire une gratte Web pour une page Web particulière à l'aide des composants suivants:


6 commentaires

En Java, getcurrenturl () donnez une URL de la page où le pilote est actif, même les nouvelles pages ouvertes en raison du pilote de clics ne se déplaceront pas vers ces pages. GetCurrenturl ne donnera donc pas cette URL.


Avez-vous une URL de test?


Cela semble être quelque chose que j'utiliserais extraire pour.


@Qharr désolé je ne le fais pas.


@Pguardiario est Fetch une méthode de certains packages? Si je comprends bien, Selenium WebDiver n'a pas une telle méthode.


Non, c'est une méthode JS. Chrome moderne / FF l'a tous deux.


3 Réponses :


-1
votes

J'ai choisi un moyen de créer une autre instance WebDriver.

driver = webdriver.Chrome()
driver_sub = webdriver.Chrome()

driver.get(url)
driver_sub.get(url)  # access the same page with different instance

for a in driver.find_elements_by_css_selector('.some-class-name'):
    script = a.get_attribute('href')
    driver_sub.execute_script(script)
    # do some work on the redirected page with driver_sub
    driver_sub.execute_script('window.history.go(-1)')  # this is almost same as driver_sub.back()


0 commentaires

1
votes

Même vous retournez la même page, mais selenium ne sais pas que c'est la même page, Selenium le traitera comme une nouvelle page. Les liens code> trouvés avant que la bouclette ne soit pas appartenant à la nouvelle page. Vous devez trouver les liens à nouveau sur la nouvelle page et les attribuer à la même variable liens code> à l'intérieur de la boucle. Utilisation d'index à itérer au lien suivant.

links = driver.find_elements_by_css_selector(.some-class-name)

for i in range(0, len(links)):
    links[i].click()  # this redirects me to another page
    print(driver.current_url)  # this shows the redirected page
    driver.back()
    print(driver.current_url). 

    # Important: find the links again on the page back from redirected page
    # to resolve the StaleElementReferenceException.
    links = driver.find_elements_by_css_selector(.some-class-name)


1 commentaires

Merci @yong. En fait, mon code comprend des boucles, donc dans mon cas, j'ai besoin de trouver des éléments utilisés pour chaque boucle, ce qui pourrait ne pas être une bonne idée. Mais dans certains cas, votre solution sera utile.



-1
votes

J'ai pu utiliser quelque chose comme celui-ci afin de se déplacer à travers des éléments lors de la modification de pages (inspiré de la réponse de Yong).

Cela vous permettra de conserver un index de boucle à travers les éléments sans se soucier de la référence nulle. . P>

    downloadList = driver.find_elements_by_id('download-form')
    
    for i in range(0, len(downloadList)):
        downloadList[i].submit()
        time.sleep(15)
        driver.get("url")
        time.sleep(5)
        downloadList = driver.find_elements_by_id('download-form')
        time.sleep(20)


1 commentaires

Ignorer les dormeurs, ceux-ci sont pour mon cas particulier.