我正在测试网络聊天应用程序。每次与我聊天的用户发送消息时,它都会附加到文本区域,就像任何聊天解决方案一样。我想检测新邮件何时到达并获取其内容(文本)。
这就像截取给定Element的javascript onChange事件一样。是否可以使用Selenium WebDriver来做到这一点?
我有兴趣测试任何支持此功能的浏览器。我对所有可能的浏览器测试此行为都不感兴趣。
目的是开发类似聊天机器人的东西,每当另一端发送消息时发送回消息。例如:
Remote user sends: Hello!
Selenium detects that and sends back: Your last message was "Hello!".
我无法更改聊天应用代码。
是否可以在不合并文本区域的情况下执行此操作?我的目的是听取事件,但我找不到类似的东西,我被告知Selenium WebDriver不支持。
答案 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;
}
}