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: P>
La page Web inclut des liens que "href" est une fonction JavaScript comme suit: p> La définition de la fonction est quelque chose comme ça. p> La requête postale ci-dessus me redirige vers une autre page que je voudrais gratter. p> La chose est la page Web d'origine contient de nombreux liens et je ' J'aime gratter les pages redirigées une par une. Cependant, il semble impossible d'obtenir l'URL de la page redirigée sans avoir en réalité une clic sur le lien () car il est redirigé par une requête postale générée dynamiquement. D'autre part, si je clique ici et déplacez-vous à la page redirigée, les éléments que j'ai utilisés pour la page Web d'origine ne peuvent plus être utilisés, après avoir revenu à la page d'origine, j'ai besoin d'obtenir le lien suivant depuis le début. . Cela se sent très redondant. P> code de code Python p> Ce que j'ai fait pour garder les éléments de la page d'origine mais ne fonctionnait pas: Strong > P> 1.Copiez un élément d'élément (ou de pilote) p> J'ai essayé de profondculier pour le conducteur lui-même, mais n'a pas fonctionné non plus.
L'erreur renvoyée est p> 2.Open une page redirigée dans un nouvel onglet p> Cependant, cela n'a pas été ouvert Un nouvel onglet, il suffit de passer à la page redirigée dans le même onglet. p> S'il n'y a pas de moyen simple, je le ferai en créant une liste ou un objet de dictionnaire pour stocker les liens que j'ai déjà grattés et à chaque fois après racler la page redirigée, je vais analyser la page d'origine. encore une fois et sauter le lien qui a déjà été vérifié. Mais je ne veux pas faire parce que c'est très redondant. p> p>
3 Réponses :
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()
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 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)
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.
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)
Ignorer les dormeurs, ceux-ci sont pour mon cas particulier.
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 code> pour.@Qharr désolé je ne le fais pas.
@Pguardiario est
Fetch CODE> 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.