Bilder hochladen mit Selenium

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kirby_Sike
User
Beiträge: 27
Registriert: Montag 13. April 2020, 10:13

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 :)
Kirby_Sike
User
Beiträge: 27
Registriert: Montag 13. April 2020, 10:13

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 :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Kirby_Sike
User
Beiträge: 27
Registriert: Montag 13. April 2020, 10:13

Also zumindest ist jetzt die Error Meldung weg xD Hochgeladen wird jedoch nichts xD
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da kann man so nix zu sagen, du musst das im Debugger des Browser nachvollziehen, was da an JS-Interaktionen wirklich stattfindet.
Kirby_Sike
User
Beiträge: 27
Registriert: Montag 13. April 2020, 10:13

Na ich werde mir das morgen mal anschauen und bei Fragen mich nochmal melden :) Danke für deine Hilfe erstmal
Kirby_Sike
User
Beiträge: 27
Registriert: Montag 13. April 2020, 10:13

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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 ;)
Kirby_Sike
User
Beiträge: 27
Registriert: Montag 13. April 2020, 10:13

Na dann probiere ich mal mein Glück xD
Kirby_Sike
User
Beiträge: 27
Registriert: Montag 13. April 2020, 10:13

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
Antworten