悬停操作后选择不正确的子菜单项

时间:2013-05-13 01:28:51

标签: python selenium webdriver selenium-webdriver

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

3 个答案:

答案 0 :(得分:3)

尝试使用普通点击代替ActionChains的移动并点击。

您的代码更改:

  1. 我认为ID是动态的,请尽量避免使用它们。
  2. 请尽量避免使用绝对xpath
  3. 使用普通点击而非ActionChain移动并点击
  4. 使用5秒WebDriverWait进行食谱链接。
  5. 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");