Selenium输入文本有下拉列表&隐藏价值观

时间:2017-06-12 01:12:40

标签: python selenium

我正在编写一个python脚本来输入文本,然后显示一个下拉列表,从项目列表中进行选择。这些项目都是隐藏值,并且在点击所述项目之前不会输入到网页。

具体而言,我试图在Fitbits网站上输入数据来跟踪食物(工作的东西,但每天输入食物消耗是乏味的)。我想自动化这个:)

我的脚本目前看起来像这样......

            #! 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

上面的当前脚本会引发以下错误。 selenium.common.exceptions.InvalidElementStateException:消息:无效的元素状态

所以我也尝试过这个stackoverflow问题的建议。 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

这引发了以下错误......

selenium.common.exceptions.TimeoutException:消息:

以下是网站的摘录

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

我可以在网站上看到以下隐藏值。在从下拉菜单中选择食物之前,该值不会传递到网页。

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

注意:我已经尝试过使用Pizza,Bread

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

这不起作用。

selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:{"方法":" xpath","选择器": " // * [@ id中=" foodselectcontainer"] / DIV / DIV [2] / UL /锂[1] / DIV / DIV [1]"}

在网页上选择食物项目之前,脚本无法继续。因此,问题。

如何传递隐藏值或从下拉列表中选择?

1 个答案:

答案 0 :(得分:0)

从您的代码段

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

yui-ac-input提到AutoComplete from YUI 2 Library(这就是我的想法)

正如您提到的网站询问凭据。我为YUI示例

创建了一个示例代码

抱歉,我不知道python。以下是Java代码。语法看起来或多或少相同。所以从下面的代码中获取想法并实现它

    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();
    }