Topic: Problema automatizzagione web con selenium  (Letto 776 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline MrPajot

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Problema automatizzagione web con selenium
« il: Maggio 27, 2017, 22:25 »
Salve a tutti, spero sia la sezione giusta, sto cercando di automatizzare la pubblicazione di un post su Facebook, riesco a loggarmi  tranquillamente, riesco pure ad immettere il testo nella textbox del post ma non riesco in nessun modo ad automatizzare la pressione del pulsante Pubblica , qualcuno saprebbe aiutarmi? in rete ho trovato migliaia di esempi ma nessuno sembra funzionare, non voglio usare le api ufficiali di Facebook per il momento.

from selenium import  webdriver

driver=webdriver.Chrome("C:\selenium\chromedriver.exe")
driver.set_page_load_timeout(30)
driver.get("http://www.facebook.com")
driver.maximize_window()
driver.implicitly_wait(20)

# Compilo i campi user e password
driver.find_element_by_id("email").send_keys("miaemail@gmail.com") # Inserisci qui la tua email
driver.find_element_by_name("pass").send_keys("miapassword") # Inserisci qui la tua password

# Clicco sul pulsante Login
driver.find_element_by_id("loginbutton").click()

# Compilo la textarea del post
driver.find_element_by_name("xhpc_message").send_keys("Questo è il contenuto del post")

# Clicco sul pulsante Condividi
# Da qui in poi mi blocco, ho fatto vari tentativi ma non riesco a trovare il giusto metodo
condividi = driver.find_element_by_xpath("//button[@value='1'][@type='submit']")
condividi.click
#find_element_by_class_name("_1mf7._4jy0._4jy3._4jy1._51sy selected._42ft").click()
« Ultima modifica: Maggio 27, 2017, 22:41 da MrPajot »

Offline axaroth

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema automatizzagione web con selenium
« Risposta #1 il: Maggio 28, 2017, 11:51 »
Alcuni dei metodi 'find' restituiscono una lista, quindi devi usare un loop o l'indice relativo per accedere agli elementi.
La libreria splinter usa selenium ma ne astrae le funzionalità rendendo il codice più chiaro, essendo documentata meglio ti consiglio di provarla.
In generale per testare il funzionamento di questi script si usa mettere un "import pdb; pdb.set_trace()" nel codice e provare i comandi manualmente, se funzionano si trascrivono nello script finale.

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re:Problema automatizzagione web con selenium
« Risposta #2 il: Maggio 28, 2017, 13:03 »
# Da qui in poi mi blocco, ho fatto vari tentativi ma non riesco a trovare il giusto metodo
condividi = driver.find_element_by_xpath("//button[@value='1'][@type='submit']")


Sicuro che sia quello l'XPath dell'elemento? Come lo hai determinato? Hai verificato se il percorso in qualche modo FB non te lo cambia sotto il naso ed ogni volta che torni alla pubblicazione (anche nella stessa sessione) è diverso?

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re:Problema automatizzagione web con selenium
« Risposta #3 il: Maggio 28, 2017, 13:16 »
Alcuni dei metodi 'find' restituiscono una lista, quindi devi usare un loop o l'indice relativo per accedere agli elementi.

Non dovrebbe essere questo il caso, a memoria:
find_element_by_xpath  # restituisce il primo elemento trovato
find_elements_by_xpath  # restituisce una lista di tutti gli elementi trovati

Offline MrPajot

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema automatizzagione web con selenium
« Risposta #4 il: Maggio 29, 2017, 14:46 »
Grazie a tutti per le risposte!

Alcuni dei metodi 'find' restituiscono una lista, quindi devi usare un loop o l'indice relativo per accedere agli elementi.
La libreria splinter usa selenium ma ne astrae le funzionalità rendendo il codice più chiaro, essendo documentata meglio ti consiglio di provarla.
In generale per testare il funzionamento di questi script si usa mettere un "import pdb; pdb.set_trace()" nel codice e provare i comandi manualmente, se funzionano si trascrivono nello script finale.
Ho provato ad usare splinter, la documentazione era molto più chiara ma non riuscivo nemmeno ad inserire il testo nella textarea in quanto mi diceva che non poteva inserire del testo, mentre per il bottone mi diceva che nonostante esistesse non era cliccabile


# Da qui in poi mi blocco, ho fatto vari tentativi ma non riesco a trovare il giusto metodo
condividi = driver.find_element_by_xpath("//button[@value='1'][@type='submit']")

Sicuro che sia quello l'XPath dell'elemento? Come lo hai determinato? Hai verificato se il percorso in qualche modo FB non te lo cambia sotto il naso ed ogni volta che torni alla pubblicazione (anche nella stessa sessione) è diverso?
Sono sicuro al 50%, l'ho determinato smanettando nel codice con la console per gli sviluppatori, avevo pensato anche io che Facebook cambiasse il codice html ma non mi sembra


Se riuscite a fare qualche esempio pratico ve ne sarei grati, nel codice stavo facendo delle prove, ma non saprei se ero sulla strada giusta, infatti nella linea 23 si vede commentata una seconda prova che non ha funzionato, se conoscete soluzioni diverse da selenium sono ben accette, vorrei evitare di usare le API di Facebook.


Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re:Problema automatizzagione web con selenium
« Risposta #5 il: Maggio 29, 2017, 14:58 »
Sono sicuro al 50%, l'ho determinato smanettando nel codice con la console per gli sviluppatori, avevo pensato anche io che Facebook cambiasse il codice html ma non mi sembra

Prova a tornare al pulsante "Pubblica" più volte dopo aver navigato in FB e verifica, da me ogni volta l'XPath è risultato diverso anche all'interno della stessa sessione.

A quando risalgono i suggerimenti che hai trovato in rete? È solo un'ipotesi, magari FB di recente ha modificato la gestione di determinati aspetti proprio per obbligare a passare dalle sue API per gestire determinate funzionalità, per cui se il suggerimento trovato in rete non è recente difficilmente funziona.
Attenzione anche al fatto che il suggerimento sia specifico per Google Chrome, ho trovato situazione in cui leggere differenze tra i browser rendono impossibile fare le stesse cose allo stesso modo su tutti i browser.

Offline MrPajot

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema automatizzagione web con selenium
« Risposta #6 il: Maggio 29, 2017, 15:30 »
Prova a tornare al pulsante "Pubblica" più volte dopo aver navigato in FB e verifica, da me ogni volta l'XPath è risultato diverso anche all'interno della stessa sessione.

Infatti prima di provare con l'XPath avevo provato molto semplicemente basandomi sulla classe del button , che su chrome rimane sempre la stessa: "_1mf7 _4jy0 _4jy3 _4jy1 _51sy selected _42ft"

Ho provato in questi due modi:

find_element_by_class_name("_1mf7 _4jy0 _4jy3 _4jy1 _51sy selected _42ft").click()


find_element_by_class_name("_1mf7._4jy0._4jy3._4jy1._51sy selected._42ft").click()


Ma nessuno dei due sembra fungere, per quanto riguarda gli esempi trovati in rete si basano tutti sul veccio form di pubblicazione, ora infatti per far diventare il pulsante pubblica visibile a schermo bisogna premere sulla  textarea, scrivendo direttamente nella textarea con selenium a schermo il pulsante diventa visibile in automatico quindi sarebbe inutile prima simulare la pressione del mouse sulla textarea e poi scriverci.

Ho provato anche con la versione mobile del sito (https://m.facebook.com) che ha molti meno elementi ed il pulsante Condividi e sempre visibile a schermo, ma nemmeno in quel caso ho trovato la soluzione, altre versioni di facebook non ne conosco, ma sono quasi sicuro che per dispositivi apple e per blackberry abbia altri sottodomini

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re:Problema automatizzagione web con selenium
« Risposta #7 il: Maggio 29, 2017, 19:01 »
per quanto riguarda gli esempi trovati in rete si basano tutti sul veccio form di pubblicazione, ora infatti per far diventare il pulsante pubblica visibile a schermo bisogna premere sulla  textarea, scrivendo direttamente nella textarea con selenium a schermo il pulsante diventa visibile in automatico quindi sarebbe inutile prima simulare la pressione del mouse sulla textarea e poi scriverci.

Mi viene un dubbio: tra
# Compilo la textarea del post
driver.find_element_by_name("xhpc_message").send_keys("Questo è il contenuto del post")

e
# Clicco sul pulsante Condividi
condividi = driver.find_element_by_xpath("//button[@value='1'][@type='submit']")
condividi.click

inserisci esplicitamente una pausa di 5 secondi con
time.sleep(5)

e vediamo cosa accade.

Offline MrPajot

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema automatizzagione web con selenium
« Risposta #8 il: Maggio 29, 2017, 23:04 »
inserisci esplicitamente una pausa di 5 secondi con
time.sleep(5)

e vediamo cosa accade.

Ho provato ad inserire la pausa, che non fa mai male,  ma non notavo miglioramenti, quindi ho provato lasciando la pausa modificare l'ultima linea in

driver.find_element_by_class_name("_1mf7").click()


Come errore ricevo:
selenium.common.exceptions.WebDriverException: Message: unknown error: Element <button class="_1mf7 _4jy0 _4jy3 _4jy1 _51sy selected _42ft" data-testid="react-composer-post-button" type="submit" value="1">...</button> is not clickable at point (645, 382). Other element would receive the click: <div class="_3ixn"></div>

Non riesco a venirne fuori  :confused:

« Ultima modifica: Maggio 29, 2017, 23:07 da MrPajot »

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re:Problema automatizzagione web con selenium
« Risposta #9 il: Maggio 30, 2017, 07:04 »
Come errore ricevo:
selenium.common.exceptions.WebDriverException: Message: unknown error: Element <button class="_1mf7 _4jy0 _4jy3 _4jy1 _51sy selected _42ft" data-testid="react-composer-post-button" type="submit" value="1">...</button> is not clickable at point (645, 382). Other element would receive the click: <div class="_3ixn"></div>

Vedi se fanno al caso tuo:
https://stackoverflow.com/questions/11908249/debugging-element-is-not-clickable-at-point-error
https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/2766

Offline axaroth

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema automatizzagione web con selenium
« Risposta #10 il: Maggio 30, 2017, 10:51 »
Il codice seguente è stato testato e funziona, però ho usato la versione mobile di facebook:

from splinter import Browser
import time

#import os
#os.environ["PATH"] += os.pathsep + '/path/to/geckodriver'

browser = Browser('firefox')

email = '[email]my@email.it[/email]'
passwd = '******'

url = "https://m.facebook.com"
browser.visit(url)

browser.fill('email', email)
browser.fill('pass', passwd)

#import pdb; pdb.set_trace()
login = browser.find_by_name('login').first
login.click()

# post
text = browser.find_by_name("xc_message").first
text.fill("Contenuto del post")

post = browser.find_by_name('view_post').first
post.click()