0

我正在使用 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 中仍然访问错误的菜单项。

4

3 回答 3

3

尝试使用普通点击而不是 ActionChains 的移动和点击。

更改您的代码:

  1. 我假设 id 是动态的,尽量避免使用它们。
  2. 尽量避免使用绝对 xpath
  3. 使用普通点击而不是 ActionChain 移动和点击
  4. 使用 5 秒 WebDriverWait 获取食谱链接。
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();
于 2013-05-13T02:39:59.040 回答
0

也许您的 XPath 已关闭?你可以试试这个 XPath:

find_element_by_xpath("//ul[@id='menu-more-menu-items']//li[2]//ul/li[1]/a[1]")

于 2013-05-13T02:15:00.080 回答
0

可能没有那么有用,但在java中我用过

new Select(driver.findElement(By.id("MyId"))).selectByVisibleText("MyText");
于 2013-05-13T10:39:08.670 回答