Python - Comment modifier l'attribut href dans le code source avant de cliquer avec Selenium
J'ai un projet où je dois toujours changer les mêmes valeurs (les couper):
<a class="sc-chPdSV iZXvhe sc-htpNat gEZjyJ" type="submit" name="audio-download" href="http:///www.website.com/get_audio/?session_token=6355f60252138cfd6.7872112701&analytics_tier=undefined&r=us-east-1&game=0&language=de&d=1" target="_blank">Geräusch als Audio-Datei herunterladen</a>
J'ai besoin de changer ce code avant de cliquer dessus:
de&d=1
à
en
et
target="_blank"
à
target=""
Réponses
Vous pouvez le faire sans injecter l'URL modifiée dans la balise A de la page. Vous pouvez simplement saisir l'URL, la modifier à l'aide urllib.parse, puis accéder à l'URL modifiée. Dans le code ci-dessous, j'avais l'habitude urllib.parsede décompresser les différentes parties de l'URL, d'apporter les modifications souhaitées, puis de réassembler l'URL.
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse
old_url = 'http:///www.website.com/get_audio/?session_token=6355f60252138cfd6.7872112701&analytics_tier=undefined&r=us-east-1&game=0&language=de&d=1'
o = list(urlparse(old_url))
q = parse_qs(o[4])
q['language'] = 'en'
del(q['d'])
o[4] = urlencode(q, doseq=True)
new_url = urlunparse(o)
print(new_url)
driver.get(new_url)
Pour modifier la de&d=1partie de l' hrefattribut lorsque envous devez induire WebDriverWait pour visibility_of_element_located()et vous pouvez utiliser l'une des stratégies de localisation suivantes :
Utilisation
CSS_SELECTOR:element = WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a[href^='http:///www.website.com/get_audio'][name='audio-download']"))) browser.execute_script("arguments[0].setAttribute('href','http:///www.website.com/get_audio/?session_token=6355f60252138cfd6.7872112701&analytics_tier=undefined&r=us-east-1&game=0&language=en')", element)Utilisation
XPATHet en une seule ligne:browser.execute_script("arguments[0].setAttribute('href','http:///www.website.com/get_audio/?session_token=6355f60252138cfd6.7872112701&analytics_tier=undefined&r=us-east-1&game=0&language=en')", WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[@name='audio-download' and text()='Geräusch als Audio-Datei herunterladen']"))))
Pour modifier l'attribut target="_blank"lorsque target=""vous devez induire WebDriverWait pour visibility_of_element_located()et vous pouvez utiliser l'une des stratégies de localisation suivantes :
Utilisation
CSS_SELECTOR:element = WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a[href^='http:///www.website.com/get_audio'][name='audio-download']"))) browser.execute_script("arguments[0].setAttribute('target','')", element)Utilisation
XPATHet en une seule ligne:browser.execute_script("arguments[0].setAttribute('target','')", WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[@name='audio-download' and text()='Geräusch als Audio-Datei herunterladen']"))))
Les références
Vous pouvez trouver quelques discussions détaillées pertinentes dans:
- Existe-t-il un moyen d'ajouter un nouvel attribut avec une valeur à un élément à l'aide de sélénium python?
- Selenium Datepicker utilisant JavascriptExecutor