点击事件似乎有时工作,有时在selenium web驱动程序中不起作用

时间:2015-04-23 11:22:09

标签: java selenium selenium-webdriver

@Then ("^I hover on (.+) menu and (.+) submenu$")
        public void mousehover(String elementName,String subMenu) throws InterruptedException{
            Actions actions = new Actions(webdriver);
            WebElement menuHoverLink = webdriver.findElement(By.xpath("//a[text() = '" + elementName + "']"));
            actions.moveToElement(menuHoverLink).build().perform();
            Thread.sleep(2000);
            actions.moveToElement(menuHoverLink).moveToElement(webdriver.findElement(By.xpath("//a[text() = '" + subMenu + "']"))).click().build().perform();
            System.out.println("Sub menu "+subMenu+" Has been clicked");
        }
  

Blockquote大家好。这是我完成鼠标悬停事件的代码,然后单击子链接。但大多数时候子链接点击事件正在运行。但有些时候不行。鼠标悬停事件已完成。但是子链接点击事件没有触发。真的不知道为什么会这样。提前谢谢..

1 个答案:

答案 0 :(得分:0)

我会尝试移动到您想要点击的位置,然后点击。使用悬停菜单,您可以从selenium获得关于elemenet是什么时候并且无法点击的奇怪行为。尝试;

actions.MoveToElement(menuHoverLink).Perform();
//wait til clickable, you are sleeping, a wait til element is both displayed and enabled would be better - can explain more if needed
action.Click().Perform();

注意:我认为只使用peform将构建动作而不明确说明

编辑: 我认为有时候它需要比2秒睡眠时间更长的元素才能被点击。抛出什么异常?

而不是thread.sleep使用等待来决定是否可以单击该元素,例如:

public void WaitForElementToBeClickable(IWebElement element)
    {
        var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10));
        wait.Until<bool>((d) =>
            {
                if (IsElementDisplayed(element) && IsElementEnabled(element))
                    return true;
                else return false;
            });
    }

    public Boolean IsElementEnabled(IWebElement element)
    {
        try
        {
            return (element.Enabled);
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }

    public Boolean IsElementDisplayed(IWebElement element)
    {
        try
        {
            return (element.Displayed);
        }
        catch (NoSuchElementException)
        {
            return false;
        }
    }