我正在使用Webdriver在Python中开发一个测试用例来点击http://www.ym.com上的菜单项,这个特定的一个用于浏览菜单项并单击一个子菜单项。
运行测试时,它看起来像是尝试访问嵌套的菜单项,但从不点击最终项目。这是我的代码,通过菜单:
food = driver.find_element_by_id("menu-item-1654")
hov = ActionChains(driver).move_to_element(food).move_to_element(driver.find_element_by_xpath("/html/body/div[4]/div/div/ul/li[2]/ul/li/a")).click()
hov.perform()
这里的问题是我试图点击“食物”菜单中的“食谱”子菜单,但会发生的是“菜单”的“法国”被点击在“旅行”菜单下,该菜单位于“食物”旁边配方
我尝试过使用find_element_by_id,find_element_by_css_locator,find_element_by_link_text,但似乎总是选择Travel下的France子菜单而不是Food下的Recipes子菜单。
有什么想法吗?
修改
我正在使用此Python代码来运行测试:
food = driver.find_element_by_xpath("//a[contains(@href, 'category/food/')]/..")
ActionChains(driver).move_to_element(food).perform()
WebDriverWait(driver, 5).until(lambda driver: driver.find_element_by_xpath("//a[contains(@href, 'category/recipes-2/')]/..")).click()
在IE中运行得非常好,但仍然可以在Firefox中访问错误的菜单项。
答案 0 :(得分:3)
尝试使用普通点击代替ActionChains的移动并点击。
您的代码更改:
food = driver.find_element_by_xpath("//a[contains(@href, 'category/food/')]/..")
hov = ActionChains(driver).move_to_element(food).move_by_offset(5, 45).perform()
# 45 is the Height of the 'FOOD' link plus 5
recipes = WebDriverWait(driver, 5).until(lambda driver: driver.find_element_by_xpath("//a[contains(@href, 'category/recipes-2/')]/.."))
recipes.click()
经过测试的C#版代码:
driver.Navigate().GoToUrl("http://www.yumandyummer.com");
IWebElement food = driver.FindElement(By.XPath("//a[contains(@href, 'category/food/')]/.."));
new Actions(driver).MoveToElement(food).MoveByOffset(5, food.Size.Height + 5).Perform();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
IWebElement recipes = wait.Until(ExpectedConditions.ElementExists(By.XPath("//a[contains(@href, 'category/recipes-2/')]/..")));
recipes.Click();
答案 1 :(得分:0)
也许你的XPath已关闭?您可以尝试使用XPath:
find_element_by_xpath("//ul[@id='menu-more-menu-items']//li[2]//ul/li[1]/a[1]")
答案 2 :(得分:0)
可能没那么有用,但在java中我使用过
new Select(driver.findElement(By.id("MyId"))).selectByVisibleText("MyText");