Seite 1 von 1

Bilder hochladen mit Selenium

Verfasst: Donnerstag 16. April 2020, 10:38
von Kirby_Sike
Ich würde gerne automatisiert Bilder hochladen auf der Seite Instagram :) Ich bereits den Code zum Einlogen und aufrufen des Upload Dialogs geschrieben :) Jedoch habe ich folgende Error Meldung :

Code: Alles auswählen

File "bot.py", line 41, in __init__
    upload.send_keys(os.getcwd() + "/File_Manager/fin4.jpg")  
AttributeError: 'NoneType' object has no attribute 'send_keys'
Ich vermute es könnte daran liegen, dass mein "find_element_by_xpath" keine Referenz returned?

Hier ist der komplette Code:

Code: Alles auswählen

from time import sleep
from selenium import webdriver
import os

class InstBot():

    def __init__(self,username, pw):
        self.username = username
        self.pw = pw
        mobile_emulation = {"deviceName": "Nexus 5"}
        options = webdriver.ChromeOptions()
        options.add_experimental_option("mobileEmulation", mobile_emulation)
        self.driver = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', options=options)
        self.driver.get("https://www.instagram.com")

        sleep(2)

        closeCookie = self.driver.find_element_by_xpath("/html/body/div[1]/section/div[1]/button").click()  #Cookie Close
        getToLogin = self.driver.find_element_by_xpath("/html/body/div[1]/section/main/article/div/div/div/div[2]/button").click()  #Go to Login

        sleep(1)

        login_field = self.driver.find_element_by_xpath("/html/body/div[1]/section/main/article/div/div/div/form/div[4]/div/label/input")\
        .send_keys(username) #Username Field
        login_field2 = self.driver.find_element_by_xpath("/html/body/div[1]/section/main/article/div/div/div/form/div[5]/div/label/input")\
        .send_keys(pw) #Password Field
        self.driver.find_element_by_xpath("/html/body/div[1]/section/main/article/div/div/div/form/div[7]").click()  #Login Button

        sleep(2)

        self.driver.find_element_by_xpath("/html/body/div[1]/section/main/div/div/div/button").click() #Close Pop_Up 1

        sleep(1)

        self.driver.find_element_by_xpath("/html/body/div[4]/div/div/div[3]/button[2]").click()  #Close Pop-Up 2

        sleep(1)

        upload = self.driver.find_element_by_xpath("/html/body/div[1]/section/nav[2]/div/div/div[2]/div/div/div[3]").click() #Click Upload Button
        sleep(1)
        upload.send_keys(os.getcwd() + "/File_Manager/fin4.jpg")  

        print("Bot successful!")
        
    def getUserName(self):
        print(self.username)

a = InstBot('testuserpython', 'test12345')


Ich bedanke mich schonmal im voraus für eure Hilfe :)

Re: Bilder hochladen mit Selenium

Verfasst: Donnerstag 16. April 2020, 12:20
von Kirby_Sike
Scheinbar liefert

Code: Alles auswählen

upload = self.driver.find_element_by_xpath("/html/body/div[1]/section/nav[2]/div/div/div[2]/div/div/div[3]").click()
keinen Wert zurück, jedoch warum ? In der Doku steht, dass es eine Referenz zu einem Webobjekt zurück gibt :)

Re: Bilder hochladen mit Selenium

Verfasst: Donnerstag 16. April 2020, 12:54
von __deets__
Bist du sicher, dass das auch fuer click() gilt? Ich kenne die API nicht, aber mich macht das erstmal stutzig. Ein "click" hat kein natuerliches Ergebnis. Der stoesst irgendwo irgendwas an, aber liefert nichts. Ich denke mal du solltest das weglassen, und click() dann auf upload ausfuehren.

Re: Bilder hochladen mit Selenium

Verfasst: Donnerstag 16. April 2020, 14:04
von Kirby_Sike
Also zumindest ist jetzt die Error Meldung weg xD Hochgeladen wird jedoch nichts xD

Re: Bilder hochladen mit Selenium

Verfasst: Donnerstag 16. April 2020, 18:10
von __deets__
Da kann man so nix zu sagen, du musst das im Debugger des Browser nachvollziehen, was da an JS-Interaktionen wirklich stattfindet.

Re: Bilder hochladen mit Selenium

Verfasst: Donnerstag 16. April 2020, 20:05
von Kirby_Sike
Na ich werde mir das morgen mal anschauen und bei Fragen mich nochmal melden :) Danke für deine Hilfe erstmal

Re: Bilder hochladen mit Selenium

Verfasst: Freitag 17. April 2020, 07:50
von Kirby_Sike
Vielleicht ein blöde Frage, aber wie Debugger ich meinen Code in Chrome? xD Ich wüsste noch ungefähr wie es bei lokalen Webseiten geht, aber ich habe ja keine Richtige JS Datei

Re: Bilder hochladen mit Selenium

Verfasst: Freitag 17. April 2020, 08:02
von __deets__
Na du kannst auf der Webseite durch Rechtsklick und inspect Element in den debugger gehen. Und dann zb anschauen was für Elemente was machen, etc. Das ist natürlich alles fummelig, weil obfuskierter Code. Und es wird auch nicht besonders robust sein, weil die ja dauernd dran rum schrauben. Aber so geht’s ;)

Re: Bilder hochladen mit Selenium

Verfasst: Freitag 17. April 2020, 08:04
von Kirby_Sike
Na dann probiere ich mal mein Glück xD

Re: Bilder hochladen mit Selenium

Verfasst: Freitag 17. April 2020, 08:12
von Kirby_Sike
Also den Debugger habe ich zwar nicht wirklich verstanden, aber ich habe gerade einen Thread auf StackOverflow gelesen und habe eine Vermutung warum es nicht funktioniert...Dort wurde geschrieben, dass man den "MacOS"-Fester-Dialog part überspringen sollte und den direkten upload über den absoluten Pfad machen soll xD Ich habe vermutlich einfach den falschen xPath in meinem Statement :)

Das Problem welches sich jetzt stellt...wie überspringe ich den Part xD Im Source Code kann ich nur das icon oder den Button ansteuern...Das Icon bringt mir nichts und der Button ruft den MacOS-Explorer-Dialog auf xD