我正在编写一个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]"}
在网页上选择食物项目之前,脚本无法继续。因此,问题。
如何传递隐藏值或从下拉列表中选择?
答案 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();
}