yarrsmash
yarrsmash

Reputation: 5

Selenium input text that has dropdown & hidden values

I am writing a python script to input text, that then has a dropdown appear to select from a list of items. These items are all hidden values and are not inputted to the webpage until selected by clicking on said item.

Specifically I am attempting to input data on Fitbits website to track food (a thing for work, but it is tedious to input food consumption each day). I would like to automate this :)

My script currently looks like this...

            #! python3
            # fitbitSubmitFood.py this script submits the food log on fitbit.com

            from selenium import webdriver
            from selenium.webdriver.common.by import By
            from selenium.webdriver.support.ui import WebDriverWait
            from selenium.webdriver.support import expected_conditions as EC

            browser = webdriver.Chrome()

            # open webpage to log food
            browser.get('https://www.fitbit.com/foods/log')

            # login to the website
            # email username input
            emailSelect = browser.find_element_by_xpath('//*[@id="loginForm"]/fieldset/dl/dd[1]/input')
            emailSelect.send_keys('EMAIL')
            # email password input
            inputPassword = browser.find_element_by_xpath('//*[@id="loginForm"]/fieldset/dl/dd[2]/input')
            inputPassword.send_keys('PASSWORD')
            # click log in
            clickLogin = browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/button')
            clickLogin.click() # clicky click!

            # input What did you eat?
            foodSelect = browser.find_element_by_xpath('//*[@id="foodselectinput"]')
            foodSelect.send_keys('Pizza, Bread') # select by visible text

            # input How Much?
            howMuch = browser.find_element_by_xpath('//*[@id="quantityselectinput"]')
            howMuch.send_keys('3')

            # click Log Food
            logfood = browser.find_element_by_xpath('//*[@id="foodAutoCompButton"]')
            # logfood.click() # clicky click!

            # Close web browser

The current script above throws the following error. selenium.common.exceptions.InvalidElementStateException: Message: invalid element state

So I have also tried suggestions from this stackoverflow question. Entering a value into a type="hidden" field using Selenium + Python

            WebDriverWait(foodSelect, 10).until(EC.visibility_of_element_located((By.XPATH,'//*[@id="foodId"]'))) # wait for hidden text to populate

This threw the following error...

selenium.common.exceptions.TimeoutException: Message:

Here is a snippet from the website

            input type="text" name="foodselectinput" id="foodselectinput" class="text columnFull yui-ac-input" maxlength="80" tabindex="1" autocomplete="off"

I can see the following on the website for the hidden value. This value is not passed to the webpage until after the food is selected from the drop down menu.

            input name="foodId" id="foodId" type="hidden" value="13272"

Note: I have already tried using the click method for the Pizza, Bread

            clickFood = browser.find_element_by_xpath('//*[@id="foodselectcontainer"]/div/div[2]/ul/li[1]/div/div[1]')
            clickFood.click() # click it!

This did not work.

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="foodselectcontainer"]/div/div[2]/ul/li[1]/div/div[1]"}

The script cannot continue until the food item is selected on the webpage. Hence, the question.

How would one pass the hidden value or select from a dropdown?

Upvotes: 0

Views: 2633

Answers (1)

Madhan
Madhan

Reputation: 5818

From your snippet

input type="text" name="foodselectinput" id="foodselectinput" class="text columnFull yui-ac-input" maxlength="80" tabindex="1" autocomplete="off"

yui-ac-input refers AutoComplete from YUI 2 Library (That's what I thought)

As the site mentioned by you asked credentials. I created a sample code for YUI Example

Sorry I dont know python.Below is a Java code. The syntax looks more or less same. So get the idea from below code and implement it

    public void start() {
        driver.get("http://yui.github.io/yui2/docs/yui_2.9.0_full/examples/autocomplete/ac_basic_array.html");
        yuiAutoSuggestSelect("Cali");
    }

    public void yuiAutoSuggestSelect(String value) {
        WebElement inputElement = driver.findElement(By.className("yui-ac-input"));
        inputElement.sendKeys(value);
        By autoSuggSel = By.xpath("//div[@class='yui-ac-container']//div[@class='yui-ac-bd']//li");
        WebElement autoSuggestEl = driver.findElement(autoSuggSel);
        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.visibilityOf(autoSuggestEl)).click();
    }

Upvotes: 0

Related Questions