以下代码尝试从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毫秒 构建信息:版本:' 2.43.0',修订版:' accb3003b9fb8f7cae30f9669b4c594a065396a6',时间:' 2014-09-09 22:22:51' 系统信息:主持人:' JARVIS',ip:' 140.203.209.182',os.name:' Windows 8',os.arch:' x86',os.version:' 6.2',java.version:' 1.7.0_45' 会话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不是
答案 0 :(得分:0)
您遇到的问题是,在Facebook页面上,$
不是jQuery。我不知道它是什么,但调用$('privacyFlyoutLabel')
将返回标识为privacyFlyoutLabel
的元素。使用jQuery,这将返回标记名称为privacyFlyoutLabel
的元素。要使用jQuery获取带有 id privacyFlyoutLabel
的元素,您必须请求$('#privacyFlyoutLabel')
。
从$
获得的是DOM节点,而不是jQuery对象,因此没有.append
方法。
选项:
忘记jQuery。编写直接访问DOM的代码。
尝试在执行您尝试的操作之前在该页面中加载jQuery。这需要添加script
元素来加载jQuery,并调用jQuery.noConflict()
来恢复$
。但问题是,在页面上已经运行的任何异步代码需要使用它之前,无法保证jQuery.noConflict
能够恢复$
。我已经使用setTimeout
完成了一些测试,并确定之前启动的异步操作可以在两个script
元素之间执行。因此,此选项实际上可能导致Facebook依赖的代码失败。