指定元素與操作


Selenium在作一些操作前,必須先指定目標(Target)元素,指定目標元素有幾種方式。例如 結合 Selenium RC 的例子中:
selenium.type("url", "www.javaworld.com.tw");

type()指令第一個參數指定了"url",這是最常用的一個方式,其完整形式其實是:
identifier=url

identifier可用來指定id或name屬性的值符合的元素,先比對id,沒有的話再比對name,先找到的元素為主。如果標籤有id或name屬性,則可以明確指定。例如:
id=someForm
name=url

如果想以超鏈結的文字進行比對。例如比對:
<a href="https://openhome.cc">Openhome</a>

則可以如下:
link=Openhome

如果你熟悉JavaScript的DOM API,也可以使用JavaScript的DOM API語法來存取。例如:
dom=document.getElementById('someForm')
dom=document.getElementsByTagName('input')[0]
dom=document.forms[0]
document.forms[0].username

如果你熟悉CSS選擇器語法,也可以使用它來指定元素。例如:
css=#someForm
css=input[name="username"]

例如原本在 結合 Selenium RC 中的例子有:
selenium.click("//input[@value='送出']");

這是XPath語法的指定方式,若要改為CSS語法可以如下:
selenium.click("css=input[value='送出']");

若要改為DOM API的方式,則可以如下:
selenium.click("document.forms[0].elements[4]");

指定元素的方式很多樣化,看你熟悉哪種方式而定,你可以參考 Locating ElementsSelenium Reference 了解更多語法說明。

至於可操作的指令,全規範在com.thoughtworks.selenium.Selenium介面中,你可以查看API文件說明,或看看 Selenium Reference 的內容。

使用 CookieManager 中的例子而言,若想改用Selenium來測試,則可以如下:
package test.cc.openhome;

import static org.junit.Assert.*;

import com.thoughtworks.selenium.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.server.SeleniumServer;

public class CookieTest {
private static Selenium selenium;
private static SeleniumServer seleniumServer;

@BeforeClass
public static void setUpClass() throws Exception {
seleniumServer = new SeleniumServer();
seleniumServer.start();

}

@Before
public void setUp() {
// 每次測試重新開啟瀏覽器
selenium = new DefaultSelenium("localhost", 4444,
"*firefox", "http://localhost:8080/CookieDemo/");
selenium.start();
}

@After
public void tearDown() {
// 每次測試完關閉瀏覽器
selenium.stop();
}

@AfterClass
public static void tearDownClass() throws Exception {
seleniumServer.stop();
}

@Test
public void testCookie() throws Exception {
selenium.open("/CookieDemo/login.html");
selenium.type("user", "caterpillar");
selenium.type("passwd", "123456");
selenium.click("login");
selenium.click("//input[@value='送出']");
selenium.waitForPageToLoad("30000");
assertTrue(selenium.isTextPresent("caterpillar已登入"));
// 是否接收到Cookie
assertEquals("caterpillar", selenium.getCookieByName("user"));
}

@Test
public void testAutoLogin() throws Exception {
// 建立Cookie
selenium.createCookie("user=caterpillar",
"path=/CookieDemo/,max_age=3600");

// 直接請求index.view,測試是否自動登入
selenium.open("/CookieDemo/index.view");
assertTrue(selenium.isTextPresent("caterpillar已登入"));
}
}