如何检测TextArea的值已经改变?

时间:2015-03-19 13:49:44

标签: java selenium-webdriver

我正在测试网络聊天应用程序。每次与我聊天的用户发送消息时,它都会附加到文本区域,就像任何聊天解决方案一样。我想检测新邮件何时到达并获取其内容(文本)。

这就像截取给定Element的javascript onChange事件一样。是否可以使用Selenium WebDriver来做到这一点?

我有兴趣测试任何支持此功能的浏览器。我对所有可能的浏览器测试此行为都不感兴趣。

目的是开发类似聊天机器人的东西,每当另一端发送消息时发送回消息。例如:

Remote user sends: Hello!
Selenium detects that and sends back: Your last message was "Hello!".

我无法更改聊天应用代码。

是否可以在不合并文本区域的情况下执行此操作?我的目的是听取事件,但我找不到类似的东西,我被告知Selenium WebDriver不支持。

2 个答案:

答案 0 :(得分:1)

好吧,回答你的问题 - “有可能吗?” - 绝对是的!! 如何 ? - 嗯,这实际上取决于聊天应用程序以及界面的自动化程度。

以这个简单的聊天应用程序为例(它像聊天机器人) - http://www.unionplatform.com/?page_id=2247 (我在示例代码中使用了它的直接URL。)

检查下面的代码,我只是检查<span>标签的更新值并循环5次以读取用户已输入并回复相同的消息+循环计数(以区分消息)。

您可以遵循类似的方法,但我再次提到它取决于聊天应用程序。

下面是代码:

public class WhiteBoard {

public WebDriver driver;
public String css_chat_text = "div#chatPane>span";
public String css_input_msg = "input#outgoing";
public String css_send_button = "input[value='Send']";
public String last_message = "";

public static void main(String[] args) throws Exception {

    WhiteBoard objTest = new WhiteBoard();
    objTest.chatBot();

}

public void chatBot() throws Exception{

    driver = new FirefoxDriver();
    driver.navigate().to("http://unionplatform.com/samples/orbitermicro/UnionChatPart1/chat.html");

    List<WebElement> objChats = driver.findElements(By.cssSelector(css_chat_text));
    if(objChats.size() > 0){
        System.out.println("Starting chattter...");
        String status;
        //loop until chat ready
        do{
            Thread.sleep(3000);
            objChats = driver.findElements(By.cssSelector(css_chat_text));

            status = objChats.get(objChats.size()-1).getText().toString();
            System.out.println(status);

        }while(!status.contains("Chat ready!"));

        Thread.sleep(3000);
        //start chatting...
        sendMessage("Hello...");

        for(int i=0; i<5; i++) {
            objChats = driver.findElements(By.cssSelector(css_chat_text));
            last_message = objChats.get(objChats.size()-1).getText().toString().trim();
            sendMessage("LastMsg:" + last_message + "#" +i);
            Thread.sleep(5000);
        }
    }
    else{
        System.out.println("Chat not found...");
    }
}


public void sendMessage(String message){

    //start chatting...
    List<WebElement> objInput = driver.findElements(By.cssSelector(css_input_msg));
    if(objInput.size() > 0){
        objInput.get(0).sendKeys(message);
        System.out.println("Sent message..." + message);
        List<WebElement> btnSend = driver.findElements(By.cssSelector(css_send_button));
        btnSend.get(0).click();
    }
}

}

睡眠只是粗暴地等待聊天盒更新,理想情况下我会继续检查<span>计数并继续增加。

上述代码的控制台输出看起来像 - https://gist.github.com/anonymous/f1eef7198648d95f1d01

此外,另一个有趣的问题可能会有所帮助 - How to test chat web app

答案 1 :(得分:1)

我认为Selenium WebDriver并不支持监听事件,所以最好的选择可能是轮询你正在寻找的元素的变化。

类似的东西:

private void pollForTextChange()
{
    WebElement textArea = this.driver.findElement(By.tagName("textarea"));

    int maxPollTime = 60;
    String lastText = textArea.getText();
    String currentText = textArea.getText();
    for (int i=0; i<maxPollTime; i++)
    {
        Thread.sleep(maxPollTime * 1000);
        currentText = textArea.getText();
        if (!currentText.equals(lastText))
        {
            // Change detected, perform desired actions here

            // Assuming it's a chat app and the new text should always contain existing text
            // and you want to get the new content sent
            String newContent = "";
            if (currentText.contains(lastText))
            {
                newContent = currentText.replace(lastText, "").trim();
                // Found new input, performed desired actions here
            }
        }

        lastText = currentText;
    }
}