2012-05-18 43 views
2

我用selenium.click("link=Sign In");如何使用Java驅動程序在Selenium中觸發點擊事件以獲取鏈接?

,我試着用selenium.click(".//*[@id='global-signin']/a");

都沒有取得我結果...

我收到如下錯誤: -

Element Link="Sign In" not found error.

代碼:

package package1_IdentifyPageOpened; 


import com.thoughtworks.selenium.*; 
import org.junit.After; 
import org.junit.Before; 
import org.junit.Test; 
//import java.util.regex.Pattern; 

public class PublicClass3 { 

/** 
* @param args 
*/ 
Selenium selenium; 

@Before 
public void setUp() throws Exception { 
    selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.washingtonpost.com/"); 
    selenium.start(); 
} 

@Test 
public void testTt4() throws Exception { 
    selenium.open("/"); 
    selenium.click("link=Sign In"); 
    selenium.type("name=MemberName", "[email protected]"); 
    selenium.type("name=Password", "[email protected]"); 
    selenium.click("name=submit"); 
    selenium.waitForPageToLoad("30000"); 

} 

@After 
public void tearDown() throws Exception { 
    selenium.stop(); 
} 


public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    } 

    } 

故障跟蹤:

com.thoughtworks.selenium.SeleniumException: ERROR: Element link=Sign In not found at com.thoughtworks.selenium.HttpCommandProcessor.throwAssertionFailureExceptionOrError(HttpCommandProcessor.java:112) at com.thoughtworks.selenium.HttpCommandProcessor.doCommand(HttpCommandProcessor.java:106) at com.thoughtworks.selenium.DefaultSelenium.click(DefaultSelenium.java:193) at package1_IdentifyPageOpened.PublicClass3.testTt4(PublicClass3.java:29) 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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

+0

你可以發佈HTML嗎? –

+0

不是在'frame'或'iframe'元素中隱藏Selenium的鏈接嗎?在這種情況下,您需要[選擇框架](http://selenium.googlecode.com/svn/trunk/docs/api/java/com/thoughtworks/selenium/Selenium.html#selectFrame%28java.lang.String %29),然後點擊鏈接。如果沒有,請向我們展示一個最小(但可重現)的HTML片段,以便我們可以爲您提供幫助。 –

+0

@ A.J包括代碼...請。看到現在,並提供您的意見和建議... – Mannii88

回答

2

我也遇到過同樣的問題,「找不到元素」問題是一個經常發生在selenium.The可能的原因這個問題的如下:

  1. 當你執行「點擊元素」,但該元素並沒有在頁面顯示,也許它在裝載procedding,那麼硒就會拋出一個異常:未找到元素。

  2. 元素的身份錯誤,可能是拼寫錯誤或硒不支持身份的方式。

我參觀了你們測試的網站,http://www.washingtonpost.com

的TestCase通過SeleniumIDE始終記錄導出時,如Java。這裏不工作是我的代碼:

public class Website extends SeleneseTestBase { 
@BeforeMethod 
public void setUp() throws Exception { 
    selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://www.washingtonpost.com/"); 
    selenium.start(); 
} 

@Test 
public void testWebsite() throws Exception { 
    selenium.open("/"); 
    waitFor("link=Sign In"); 
    waitSecomd(3); 
    selenium.click("link=Sign In"); 
    selenium.waitForPageToLoad("60000"); 
    selenium.type("name=MemberName", "[email protected]"); 
    selenium.type("name=Password", "adfasd"); 
    selenium.click("name=submit"); 
    selenium.waitForPageToLoad("60000"); 
} 

@AfterMethod 
public void tearDown() throws Exception { 
    selenium.stop(); 
} 
public void waitFor(String locator) throws Exception { 
    for (int second = 0;; second++) { 
     if (second >= 60) 
      fail("timeout"); 
     try { 
      if (selenium.isVisible(locator)) 
       break; 
     } catch (Exception e) { 
     } 
     Thread.sleep(1000); 
    } 
} 


public void waitSecomd(int n) throws Exception { 
    for (int second = 0;; second++) { 
     if (second >= 60) 
      fail("timeout"); 
     try { 
      if (second > n - 1) 
       break; 
     } catch (Exception e) { 
     } 
     Thread.sleep(1000); 
    } 
} 

}

+0

感謝您的解決方案...我猜你正在使用不同版本的Selenium ...我使用2.2 ... waitFor方法沒有找到...你能否提供最新的方法... – Mannii88

+1

我的上帝! waitFor()方法是由我自己提供的,它不是selenium API。我在我的代碼中提供了該方法,您可以如何忽略它。 – LiveJin

+0

對不起,我到最後沒有看到......現在,工作。> – Mannii88

1

<a>元素是動態創建(和一個壞的方式 - 它顯示了很長一段時間後),硒能不能找到它。如果你看看頁面的源代碼,你只能看到

<div id="utility-wrapper" data-tracking-type="utility"> 
    <ul id="utility-links" class="inline-list"> 
     <li id="global-signin" style="min-width:32px;"></li> 

的原因是在登錄鏈接作爲創建的js文件之一如下:

I.innerHTML = '<a href="' + D + "...a loong piece of URL..." + H + '">Sign In</a>'; 

Selenium可以找到一個動態創建的元素,但只能在創建之後,而不是之前。

頭部的第一個解決方案selenium.click("id=global-signin")不起作用,因爲找到並單擊了該元素,但尚未包含實際鏈接(由js在一段時間後創建)。


解決的辦法是等待元素展現出來:

long targetTime = System.currentTimeMillis() + 10000; // 10 seconds from now 
boolean found = false; 
while (System.currentTimeMillis() < targetTime && !found) { 
    if (selenium.isElementPresent("link=Sign In")) { 
     selenium.click("link=Sign In"); 
     found = true; 
    } 
} 
if (!found) { 
    throw new SeleniumException("Element not found!"); 
} 

你甚至可以編寫自己的click(String)方法(和其他人也有可能通過代碼重複要麼圖省事,或通過Command pattern)更難但更好的方式,合併此用於每個搜索。

Selenium 2 (WebDriver)它會更容易通過Implicit wait做到:

// open Firefox 
WebDriver driver = new FirefoxDriver(); 
// set the Implicit wait to 10 seconds 
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 
driver.get("http://www.washingtonpost.com/"); 
driver.findElement(By.linkText("Sign In")).click(); 
+0

我以前檢查過id = global-signin,還有,等待時間,它不適用於我,最初......它是從你的最終工作? – Mannii88

+1

已編輯。很多。你應該認真考慮切換到WebDriver。但是Selenium解決方案現在也適用於我。隨意詢問是否有任何不清楚的地方。 –

+0

感謝讓它更容易...第一種方法,你通過例外給予不工作...它的拋出異常....第二種方法,通過WebDriver工作....在你的第二個解決方案中有一個錯字...你離開Driver.findElement ...謝謝! – Mannii88

1

這很困難 - 我遇到的問題在第二頁 - 除非我先選擇目標定位器,否則Selenium無法將任何數據輸入到表單中。這是我的解決方案:

import java.util.concurrent.TimeUnit; 

import org.junit.Test; 
import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.chrome.ChromeDriver; 

public class LoginTest { 

    private static final String USERNAME = "username"; 
    private static final String PASSWORD = "password"; 
    private static final int PAUSE = 10; 

    @Test 
    public void testWebsiteTwo() throws Exception { 
     WebDriver driver = new ChromeDriver(); 
     driver.manage().timeouts().implicitlyWait(PAUSE, TimeUnit.SECONDS); 
     driver.get("http://www.washingtonpost.com/"); 
     WebElement signin = driver.findElement(By 
       .cssSelector("li#global-signin a")); 
     signin.click(); 

     // this line is crucial so that Selenium can enter the username/password 

     WebDriver.TargetLocator locator = driver.switchTo(); 
     locator.frame(0); 
     WebElement name = driver.findElement(By.cssSelector("input#username")); 
     name.sendKeys(USERNAME); 
     WebElement password = driver.findElement(By.cssSelector("input#password")); 
     password.sendKeys(PASSWORD); 
     WebElement form = driver.findElement(By.cssSelector("form[name=form]")); 
     form.submit(); 
     Thread.sleep(5000); 
     driver.close(); 
    } 

} 
+0

謝謝!! :)你的解決方案看起來整潔,我一定會考慮它,並回來.. :) – Mannii88

相關問題