Selenium.click无法处理某些锚元素

时间:2011-05-26 06:43:57

标签: jquery selenium fullcalendar selenium-rc selenium-ide

正在开发的应用程序最近进行了改进,并且作为其中一部分引入了新的JQuery日历。我需要点击日历中的链接来选择时间和日期。但是,Selenium.click无效。该命令被执行,但屏幕上没有任何反应。

要检查我的XPATH / CSS定位器(我试过两者)是否正确,我添加了selenium.getText(locator)和selenium.highlight(locator)命令。两个都工作!没问题。它只有点击不起作用。

检查萤火虫后,我可以看到我试图点击的div是一种灰色的状态。这是否意味着该元素被禁用?请参阅下面的firebug屏幕截图。

我还尝试在Selenium IDE中运行相同的命令。在IDE中,这有时“有时”。

我正在使用Selenium 1.xx运行此测试。

更新

  

我还做了一件事   调试。在试运行期间,我   在浏览器中打开了Selenium IDE   以便它记录什么是动作   发生。 IDE记录了所有操作   直到这个点击。但我看不到   单击时IDE中的任何内容   命令已执行。任何想法的人,   会是什么原因?

之前有没有人遇到过类似的问题?任何帮助将不胜感激!!! Firebug screenshot

6 个答案:

答案 0 :(得分:2)

尝试selenium.fireEvent(locater, 'click'),或使用与浏览器更紧密集成的Selenium 2.

您可能遇到与其他人相同的问题,例如

Selenium clicks not working with GWT

Using Selenium to 'click' on non-input or non-control elements

它似乎与使用Javascript添加的点击事件有关。

<强>被修改

我不知道你是否使用相同的日历实现,但我发现fullcalendar.js jQuery one替换了mouseover事件,你必须首先触发它。我用它来使用

selenium.runScript("jQuery(\"a:contains('" + NEW_EVENT_NAME
        + "')\").trigger('mouseover');jQuery(\"a:contains('"
        + NEW_EVENT_NAME + "')\").trigger('click')");

答案 1 :(得分:0)

我们的JQuery日历实现与默认的Selenium定位器兼容,即使在DOM中禁用了定位器。这是一个例子,供您尝试:

selenium.click("link=11:00 AM - 01:00 PM");

答案 2 :(得分:0)

好的,我只是假设你的XPATH让这个范围正确,我怀疑你的selenium脚本运行速度比你的页面加载快,所以添加这个函数等到页面加载

waitForPageToLoad

希望有所帮助 :)

答案 3 :(得分:0)

执行以下操作:

selenium.focus("locator path of where you want to click");
selenium.keyPressNative("10"); // this is clicking entering button

这应该可以胜任。

确保在Selenium执行keyPressNative声明时不要触摸鼠标。

答案 4 :(得分:0)

我最近遇到过类似的问题。请注意,我使用Selenium驱动程序。所以我不确定我的方法是否适合Selenium 1.xx

问题在于点击隐藏菜单elemnt,它出现在鼠标悬停事件中。 我找到的Firefox selenium驱动程序的解决方案:

WebElement mnuElement;
WebElement submnuElement;
mnEle = driver.findElement(By.Id("mnEle")).Click();
sbEle = driver.findElement(By.Id("sbEle")).Click();

Actions builder = new Actions(driver);
// Move cursor to the Main Menu Element
builder.MoveToElement(mnEle).Perform();
// Giving 5 Secs for submenu to be displayed
Thread.sleep(5000L);
// Clicking on the Hidden SubMenu
driver.findElement(By.Id("sbEle")).Click();

这是link

主要思想是创建Actions的实例并尝试关注您的元素并单击它。 我会采取以下方式行事: //找到隐形元素的xpath:

    String xpathInvisible = "//*[id="calendar"]/div/div/div/div[1]";

//find xpath of the element, on hovering which your invisible (inactive) element appear. I mean somthing //like VDIs (see my screen) on pressing which menu elements appear.

    String xpathCalendarToAppear =".....";

WebElement calendarToAppear= driver.findElement(By.xpath(xpathCalendarToAppear));
WebElement invisibleElement=driver.findElement(By.xpath(xpathInvisible));

Actions builder = new Actions(driver);
builder.MoveToElement(calendarToAppear).Perform();
// Giving 5 Secs for submenu to be displayed
Thread.sleep(5000L);
// Clicking on the Hidden SubMenu
invisibleElement.Click();

在Firefox中,这可行。但IE驱动程序在点击元素时遇到问题。 所以我用以下方式直接使用jscript克服了这个“IE问题”:

WebElement hiddenWebElement =driver.findElement(By.xpath(....));
        ((JavascriptExecutor)driver).executeScript("arguments[0].click()",hiddenWebElement);

我们使用要单击的元素初始化hiddenWebElement变量。 使用jscript我们点击它。

希望这会对你有所帮助。

答案 5 :(得分:0)

我遇到了类似的问题(一个锚点/链接元素出了一百个左右我在测试之前就被拒绝被标准的硒点击方法点击)。

在我的情况下,我能够解决问题,原因完全不清楚,使用Selenium WebDriver Actions(记录为here用于Java和here用于Ruby)来执行clickAndHold / click_and_hold行动,然后是释放行动。在Ruby中,这样做(从发布的Ruby文档中的代码示例):

el = driver.find_element(:id, "some_id")
driver.action.click_and_hold(el).release.perform

希望这有助于其他人,也许有更多洞察力的人可以解释其背后的原因。