Python - Come modificare l'attributo href nel codice sorgente prima di fare clic utilizzando Selenium
Ho un progetto in cui devo sempre modificare gli stessi valori (tagliarli):
<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>
Devo modificare questo codice prima di fare clic su di esso:
de&d=1
per
en
e
target="_blank"
per
target=""
Risposte
Puoi farlo senza inserire l'URL modificato nel tag A sulla pagina. Puoi semplicemente prendere l'URL, modificarlo utilizzando urllib.parsee quindi accedere all'URL modificato. Nel codice seguente ho utilizzato urllib.parseper decomprimere le varie parti dell'URL, apportare le modifiche desiderate e quindi riassemblare 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)
Per modificare la de&d=1parte hrefdell'attributo di cui enhai bisogno per indurre WebDriverWait per il visibility_of_element_located()e puoi utilizzare una delle seguenti strategie di localizzazione :
Utilizzando
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)Utilizzando
XPATHe in un'unica riga: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']"))))
Per modificare l'attributo target="_blank"come target=""è necessario indurre WebDriverWait per il visibility_of_element_located()e puoi utilizzare una delle seguenti strategie di localizzazione :
Utilizzando
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)Utilizzando
XPATHe in un'unica riga: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']"))))
Riferimenti
Puoi trovare un paio di discussioni dettagliate pertinenti in:
- C'è un modo per aggiungere un nuovo attributo con un valore a un elemento utilizzando selenio python?
- Selenio Datepicker utilizzando JavascriptExecutor