Python - como editar o atributo href no código-fonte antes de clicar em Selenium

Sep 15 2020

Tenho um projeto em que sempre preciso alterar os mesmos valores (recorte-os):

<a class="sc-chPdSV iZXvhe sc-htpNat gEZjyJ" type="submit" name="audio-download" href="http:///www.website.com/get_audio/?session_token=6355f60252138cfd6.7872112701&amp;analytics_tier=undefined&amp;r=us-east-1&amp;game=0&amp;language=de&amp;d=1" target="_blank">Geräusch als Audio-Datei herunterladen</a>

Preciso alterar este código antes de clicar nele:

de&amp;d=1

para

en

e

   target="_blank"

para

target=""

Respostas

JeffC Sep 15 2020 at 11:55

Você pode fazer isso sem injetar o URL modificado na tag A da página. Você pode simplesmente pegar o URL, modificá-lo usando urllib.parsee, em seguida, navegar até o URL modificado. No código abaixo, usei urllib.parsepara descompactar as várias partes do URL, fazer as alterações desejadas e, em seguida, remontar o URL.

from urllib.parse import urlparse, parse_qs, urlencode, urlunparse

old_url = 'http:///www.website.com/get_audio/?session_token=6355f60252138cfd6.7872112701&amp;analytics_tier=undefined&amp;r=us-east-1&amp;game=0&amp;language=de&amp;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)
DebanjanB Sep 17 2020 at 18:50

Para alterar a de&amp;d=1parte do hrefatributo conforme envocê precisa induzir WebDriverWait para o visibility_of_element_located()e você pode usar uma das seguintes estratégias de localizador :

  • Usando 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&amp;analytics_tier=undefined&amp;r=us-east-1&amp;game=0&amp;language=en')", element)
    
  • Usando XPATHe em uma única linha:

    browser.execute_script("arguments[0].setAttribute('href','http:///www.website.com/get_audio/?session_token=6355f60252138cfd6.7872112701&amp;analytics_tier=undefined&amp;r=us-east-1&amp;game=0&amp;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']"))))
    

Para alterar o atributo target="_blank"conforme target=""você precisa induzir WebDriverWait para o visibility_of_element_located()e você pode usar uma das seguintes estratégias de localizador :

  • Usando 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)
    
  • Usando XPATHe em uma única linha:

    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']"))))
    

Referências

Você pode encontrar algumas discussões detalhadas relevantes em:

  • Existe uma maneira de adicionar um novo atributo com um valor a um elemento usando selenium python?
  • Selenium Datepicker usando JavascriptExecutor