Selenium Webdriver click()没有做任何事情

时间:2013-09-27 15:22:49

标签: java selenium click webdriver

应该很简单,我有以下代码: -

DesiredCapabilities capabilities = new DesiredCapabilities();
DesiredCapabilities.internetExplorer();
capabilities.setCapability("nativeEvents",false);

WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"),capabilities);

// And now use it
driver.get("dvfow01.mySite.com");
Thread.sleep(5000);

driver.findElement(By.linkText("Create")).click();
System.out.println("test");
driver.findElement(By.id("CreateDeal")).click();

它单击第一个项目(“创建”的linkText)但从未到达序列中的下一行。当我关闭浏览器时,它会点击下一行,打印出文本“test”,然后由于关闭窗口上没有元素,显然会立即崩溃。

有什么建议吗?我正在运行所有最新版本......

单击此链接会通过tagit.js扩展隐藏的部分,因此它看起来像下拉但不是......页面的html看起来像......

  <li class="dropdown"><a href='#' class='collermenu dropdown-toggle' data-toggle='dropdown'>Create <b class='caret'></b></a>
        <ul class="dropdown-menu">
            <li><a id="createDeal">Deal</a></li>
            <li><a id="second">someting</a></li>
            <li><a id="third">something else</a></li>
            <li><a id="fourth">a fourth</a></li>
            <li><a id="fifth">the last</a></li>
        </ul>
    </li>

我和我的开发人员说过,他们告诉我他们正在运行一个名为signalr with everframe的东西,以便不断地回到服务器进行更新/弹出窗口等?

有人听说过这个或与硒一起使用吗?

3 个答案:

答案 0 :(得分:3)

  

单击第一个项目(“创建”的linkText)但从未到达序列中的下一行。

这通常源于应用程序问题。 WebDriver将等到页面完全加载,我的猜测是它永远不会完全加载。有一个应用程序问题,这可以解释为什么在你关闭之后,它回应了那个。

我也愿意打赌,如果你等了足够长的时间,Selenium会吐出异常。

我提出的建议是先清理你的代码..

除非您希望它是专用服务器,否则请勿使用集线器。如果您在本地计算机上运行测试,只需使用本地webdriver实例。

DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
capabilities.setCapability("nativeEvents",false);

WebDriver driver = new IEDriver(capabilities);

driver.get("http://myurl.com");

其次,取出并离开所有明确的等待,如Thread.sleep()。 Selenium有所谓的隐式等待。如果这些还不够,请编写自己的方法,例如waitForElement(By)等待出现的内容。

此外,它可能有助于解释点击<a href="someurl">Create</a>

后发生的情况

修改

编辑完成后,我可以给你更多指示。如果您的方案是......

  
      
  1. 点击链接。
  2.   
  3. 点击下拉列表中的项目。
  4.   

然后你可以做类似的事情 -

driver.findElement(By.cssSelector("li.dropdown > a[data-toggle='dropdown']")).click();
driver.findElement(By.cssSelector("li.dropdown li > a#createDeal")).click();

由于我不喜欢这些手动findElements,我想与您分享一个很棒的项目来帮助您开始使用Selenium WebDriver Java。 Getting started with selenium (java) on GitHub

这是一个非常实用的项目,包括流畅的样式界面,并将您从所有这些driver.findElement()中抽象出来。你的测试看起来像,

@Config(url="http://mysite.com", browser=Browsers.IE)
public class MyTest extends AutomationTest {
    @Test
    public void test() {
        // we will be at mysite.com right now.
        click(By.cssSelector("li.dropdown > a[data-toggle='dropdown']")
        .click(By.cssSelector("li.dropdown li > a#createDeal"))
        .validatePresent(By.id("someIdThatAppearsAFterClicking"));
    }
}

答案 1 :(得分:1)

我能想到的唯一解决方案是改变开发人员在我们的开发环境中使用signalR的方法。他们正在使用永久帧,但这只是不用硒球,所以我不得不让他们改回长轮询。在dev vs live中使用不同的配置并不理想,但它会解决问题......

答案 2 :(得分:0)

试试这个示例代码:

JavascriptExecutor executor= (JavascriptExecutor)driver;
executor.executeScript("document.getElementById('ID').style.display='block';");
Select select = new Select(driver.findElement(By.id("ID")));
select.selectByVisibleText("value");
Thread.sleep(6000);

通过使用javascript执行器并使元素可见,然后单击元素到ID。希望它有所帮助..