1

I was trying to automate a post to Facebook using Python Selenium, and it was 90% complete. The only issue is that the string I give is "test," but when Facebook posts, it just sends the first character of "test," which is "t."

This is the code:

#libraries

from selenium import webdriver
from selenium.webdriver.common.by import By
import selenium.webdriver.common.keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import bs4
from bs4 import BeautifulSoup as soup
from urllib.request import Request, urlopen
from time import sleep
import pyautogui


#fetching hashtags

def hashtags(hash_idea):
    url = 'http://best-hashtags.com/hashtag/' + hash_idea

    try:
        req = Request(url, headers={'User-Agent' : 'Mozilla/5.0'})
        page = urlopen(req, timeout=10)
        page_html = page.read()
        page.close()
        page_soup = soup(page_html, 'html.parser')
        result = page_soup.find('div',{'class':'tag-box tag-box-v3 margin-bottom-40'})
        tags = result.decode()
        start_index = tags.find('#')
        end_index = tags.find('</p1>')
        tags = tags[start_index:end_index]

        return tags
    except:
        print('Something went wrong While Fetching hashtags')


def login(username, password):

    try:
        url = 'https://facebook.com'
        driver.get(url)
        user = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.NAME, 'email')))
        user.send_keys(username)
        pas = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.NAME, 'pass')))
        pas.send_keys(password)
        login_btn = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.NAME,'login')))
        login_btn.click()

    except:
        print('Something went wrong while login process')

def upload(img_path,caption):
    try:
        btn1 = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[1]/div/div[3]/div/div/div/div[1]/div[1]/div/div[2]/div/div/div/div[3]/div/div[2]/div/div/div/div[1]/div/div[1]')))
        btn1.click()

        btn2= WebDriverWait(driver,20).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[1]/div/div[4]/div/div/div[1]/div/div[2]/div/div/div/form/div/div[1]/div/div/div/div[3]/div[1]/div[2]/div/div[1]/div/span/div/div/div[1]/div/div/div[1]/i')))
        btn2.click()

        btn3 = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[1]/div/div[4]/div/div/div[1]/div/div[2]/div/div/div/form/div/div[1]/div/div/div/div[2]/div[1]/div[2]/div/div[1]/div/div/div/div[1]/div/div/div/div[1]/div/i')))
        btn3.click()

        pyautogui.write(img_path)
        pyautogui.press('enter')

        cap = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[1]/div/div[4]/div/div/div[1]/div/div[2]/div/div/div/form/div/div[1]/div/div/div/div[2]/div[1]/div[1]/div[1]/div/div/div[1]')))
        cap.send_keys(caption)

        sleep(5) # this is mandatory while doing some thing with bot

        btn_post = WebDriverWait(driver,20).until(EC.presence_of_element_located((By.XPATH, '/html/body/div[1]/div[1]/div[1]/div/div[4]/div/div/div[1]/div/div[2]/div/div/div/form/div/div[1]/div/div/div/div[3]/div[2]/div/div/div[1]/div')))
        btn_post.click()
    except:
        print('Something Went Wrong While posting the image or video')

if __name__== "__main__":
    #turn for credentials, driver, and caption
    username = input('username : ')
    password = input('pass : ')
    img_path = 'pic1.jpg'
    hash_idea = 'covid'
    caption = 'test'  # if you want to
    caption = caption + '\n' + hashtags(hash_idea)
    driver = webdriver.Firefox(executable_path="C:/Users/Asus/Downloads/Compressed/geckodriver-v0.32.0-win64/geckodriver.exe")
    login(username,password)
    upload(img_path,caption)

I wanted to automate the post with the text I provided in the code.

0

1 Answer 1

2

You can try several alternatives

  1. In the definition of cap replace presence_of_element_located with element_to_be_clickable.

  2. Do what in 1. and moreover add

    cap = ...
    cap.clear()
    cap.click()
    cap.send_keys(caption)
    
  3. Do what in 1. and moreover use ActionChains

    from selenium.webdriver.common.action_chains import ActionChains
    actions = ActionChains(driver)
    cap = ...
    actions.move_to_element(cap) # move the mouse to the middle of element
    actions.click()
    actions.send_keys(caption).perform()
    

If none works, then you can always send one character at a time

[cap.send_keys(c) for c in caption] 
Sign up to request clarification or add additional context in comments.

3 Comments

Hello, friend Thank you for your response; much appreciated. Although the problem has been fixed and the entire string can be sent, the post button is no longer functional. The previous issue, where a string couldn't send completely, has been resolved. The post button was functioning properly at the time but now the string can be send and the post button is not working 🥲
@Raveen If the question is solved you may consider marking the answer as accepted by clicking ✔ on the left. Regarding the problem with post button, I suggest you asking a new question
Had the same issue with facebook. The last variant works fine.. I am sending leter 1 by 1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.