Raveen
Raveen

Reputation: 33

Python Selenium .send_keys() only sending first character of my string

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.

Upvotes: 1

Views: 1104

Answers (1)

sound wave
sound wave

Reputation: 3537

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] 

Upvotes: 2

Related Questions