使用selenium实现jquery时出错

时间:2015-02-15 15:30:28

标签: java javascript jquery selenium

以下代码尝试从Facebook页面中删除项目并将其附加到另一个ID。但我得到一个错误,我无法找到问题。

WebDriver driver = new FirefoxDriver();

@BeforeTest
public void launchbrowser(){
    String baseUrl = "http://www.facebook.com";
    driver.get(baseUrl);
    driver.findElement(By.id("email")).sendKeys("anyman@hotmail.com");
    driver.findElement(By.id("pass")).sendKeys("deltaduck");
    driver.findElement(By.id("loginbutton")).click();

}

@Test
public void test() throws Exception {


    remove();
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    append();

}


protected void click(String elementId){
    String script ="document.getElementById('" + elementId + "').click();";

    executeJavascript(script);


}


protected void remove(){
    String remove ="$('userNavigationLabel').remove();";
    executeJavascript(remove);
}

protected void append(){
    String append ="$('privacyFlyoutLabel').append('u_0_f');";
    executeJavascript(append);
}

private void executeJavascript(String script){

    JavascriptExecutor je = (JavascriptExecutor) driver;
    try {
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    je.executeScript(script);       
}

}
                                                                 我得到的错误信息是:

<。>`.org.openqa.selenium.WebDriverException:$(...)。append不是函数 命令持续时间或超时:26毫秒

org.openqa.selenium.WebDriverException:$(...)。append不是函数 命令持续时间或超时:26毫秒 构建信息:版本:&#39; 2.43.0&#39;,修订版:&#39; accb3003b9fb8f7cae30f9669b4c594a065396a6&#39;,时间:&#39; 2014-09-09 22:22:51&#39; 系统信息:主持人:&#39; JARVIS&#39;,ip:&#39; 140.203.209.182&#39;,os.name:&#39; Windows 8&#39;,os.arch:&#39; x86&#39;,os.version:&#39; 6.2&#39;,java.version:&#39; 1.7.0_45&#39; 会话ID:a8a7480e-8e66-499b-b660-803e10e91197 驱动程序信息:org.openqa.selenium.firefox.FirefoxDriver Capabilities [{platform = WINDOWS,databaseEnabled = true,cssSelectorsEnabled = true,javascriptEnabled = true,acceptSslCerts = true,handlesAlerts = true,browserName = firefox,webStorageEnabled = true,nativeEvents = true,rotating = false,locationContextEnabled = true,applicationCacheEnabled = true ,takeScreenshot = true,版本= 31.0}]     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)     at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)     at java.lang.reflect.Constructor.newInstance(Unknown Source)     在org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:204)     在org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:156)     在org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:599)     在org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:508)     在Main.executeJavascript(Main.java:65)     在Main.append(Main.java:54)     在Main.test(Main.java:33)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)     在org.testng.internal.Invoker.invokeMethod(Invoker.java:714)     在org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)     at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)     at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)     at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)     在org.testng.TestRunner.privateRun(TestRunner.java:767)     在org.testng.TestRunner.run(TestRunner.java:617)     在org.testng.SuiteRunner.runTest(SuiteRunner.java:334)     在org.testng.SuiteRunner.run顺序(SuiteRunner.java:329)     在org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)     在org.testng.SuiteRunner.run(SuiteRunner.java:240)     在org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)     在org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)     at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)     在org.testng.TestNG.runSuitesLocally(TestNG.java:1149)     在org.testng.TestNG.run(TestNG.java:1057)     at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)     在org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)     在org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175) 引起:org.openqa.selenium.WebDriverException:$(...)。append不是

1 个答案:

答案 0 :(得分:0)

您遇到的问题是,在Facebook页面上,$不是jQuery。我不知道它是什么,但调用$('privacyFlyoutLabel')将返回标识为privacyFlyoutLabel的元素。使用jQuery,这将返回标记名称privacyFlyoutLabel的元素。要使用jQuery获取带有 id privacyFlyoutLabel的元素,您必须请求$('#privacyFlyoutLabel')

$获得的是DOM节点,而不是jQuery对象,因此没有.append方法。

选项:

  1. 忘记jQuery。编写直接访问DOM的代码。

  2. 尝试在执行您尝试的操作之前在该页面中加载jQuery。这需要添加script元素来加载jQuery,并调用jQuery.noConflict()来恢复$。但问题是,在页面上已经运行的任何异步代码需要使用它之前,无法保证jQuery.noConflict能够恢复$ 。我已经使用setTimeout完成了一些测试,并确定之前启动的异步操作可以在两个script元素之间执行。因此,此选项实际上可能导致Facebook依赖的代码失败。