在IE中运行的Selenium webdriver脚本在Firefox中挂起

时间:2012-10-23 13:11:36

标签: selenium webdriver selenium-webdriver

我过去使用过selenium RC,但我是webdriver的新手。  我的应用中有三个链接。通知,消息和连接。 在单击通知时,将显示通知下拉框。在单击消息时,将显示消息下拉框,并在单击连接时显示连接下拉框。 在脚本中,我单击通知链接,等待通知下拉框,然后断言通知dropbox。消息和连接顺序相同。 通知顺序正常工作。在消息中,它单击消息链接,然后挂起等待消息下拉框链接。我知道这是因为我在每一行之后都放了打印命令。 Heres是我的代码:

 driver.findElement(By.xpath("//a[@id='notifications-page-button']")).sendKeys("\n");
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@id='notifications-dropdown-list']//li//div[@class='message']")));
Assert.assertTrue(isElementPresent(By.xpath("//div[@id='notifications-dropdown-list']//li//div[@class='message']")), "Notifications drop box was not displayed");

wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//a[@id='messages-page-button']")));

driver.findElement(By.xpath("//a[@id='messages-page-button']")).sendKeys("\n");
wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='sf_messages_list dropdown']//li//div[@class='message']"))); //This is the line where the script hangs. If I remove this line and the next line and continue with just the click commands, they work. But when I have this line and the next, the remaining click commands are not executed

Assert.assertTrue(isElementPresent(By.xpath("//div[@class='sf_messages_list dropdown']//li//div[@class='message']")), "Messages drop box was not displayed");

wait.until(ExpectedConditions.presenceOfElementLocated(By.id("connections-page-button"))); 
driver.findElement(By.id("connections-page-button")).click()

下面是HTML for messages部分:

<li class="icon mm open">
<a id="messages-page-button" class="mm" href="#">
<span class="icon"></span>
<span class="badge hidden_elem">
<strong>
<em>0</em>
</strong>
</span>
</a>
<div class="dropdown-holder">
<div class="sf_messages_list dropdown" data-eventprefix="mainmenu_messages">
<div class="tb-dropdown-header">Messages</div>
<div class="tb-dropdown-body" data-url="/messages/dropdown">
<div class="document-title" style="display: none; !important"> - Dropdown Messages</div>
<div id="messages_list_view_76345" class="message-threads-listview">
<ul>
<div class="no_items hidden_elem">
</div>
</div>
<div class="tb-dropdown-footer" style="display: block;">
</div>
<span class="shadow-hide"></span>
</div>
</li>

下面是通知HTML部分:

<li class="icon mm">
<a id="notifications-page-button" class="mm" href="#">
<span class="icon"></span>
<span class="badge hidden_elem">
<strong>
<em>0</em>
</strong>
</span>
</a>
<div class="dropdown-holder">
<div id="notifications-dropdown-list" class="sf_notifications_list dropdown" data-eventprefix="mainmenu_notifications">
<div class="tb-dropdown-header">Notifications</div>
<div class="tb-dropdown-body" data-url="/notifications/dropdown"></div>
<div class="tb-dropdown-footer">
<a class="view_all" href="/notifications/view">View All Notifications</a>
</div>
</div>
<span class="shadow-hide"></span>
</div>
</li>

以上代码适用于IE。所以看起来问题并不在于它无法找到元素。 我使用的是Selenium 2.25.0。我尝试过各种版本的FF,包括3.6,7,11,13,15和16.但它们都没有奏效。 此外,该脚本只是挂起。它甚至不会在eclipse中抛出错误。我曾经让我的脚本运行了大约11个小时,但仍然没有错误。

如果您需要更多信息以帮助我解决此问题,请与我们联系。

谢谢!

2 个答案:

答案 0 :(得分:1)

在以前版本的Selenium Webdriver中发生了类似的事情。我也一无所知,发生在我身上。最后,更新到最新版本的Selenium帮助我做得很好,但因为2.25.0是最新版本,我至少会向您介绍我使用的解决方法,直到更新解决它

每当我需要点击按钮时,都没有发生任何事情(对你而言)。所以解决方法是,当点击按钮时,我还会向其发送Enter键事件。

更具体一点:

 WebElement buttonWhereClickingDoesNotWork = driver.findElement(By.id("messages-page-button");
buttonWhereClickingDoesNotWork.click();
buttonWhereClickingDoesNotWork.sendKeys(Keys.ENTER);

是的,它的解决方法。是的,它不好。是的,它确实帮助了我。

而且:不,我不知道这个的根本原因,因为Selenium的更新帮助了我...

答案 1 :(得分:0)

这似乎与Facebook登录有一些联系。你是否正确切换窗口句柄?你的隐式超时是什么,默认设置为30秒,所以我不确定你的脚本是否可以运行11个小时而不会出错。

你能试试这些

吗?

1)我猜测className("message")不存在,并且您的脚本实际上已经陷入该步骤,而不是之后的步骤。这涉及点击。

driver.findElement(By.id("notifications-page-button")).click();
wait.until(driver.findElement(By.id("messages-page-button")));#<<-- Changed the element to wait for

//The code works untill here. But on the next command that clicks messages link, it hangs
driver.findElement(By.id("messages-page-button")).click();
wait.until(ExpectedConditions.presenceOfElementLocated(By.className(("username"))));

2)删除等待元素

driver.findElement(By.id("notifications-page-button")).click();
#removed this wait for element

//The code works untill here. But on the next command that clicks messages link, it hangs
driver.findElement(By.id("messages-page-button")).click();
wait.until(ExpectedConditions.presenceOfElementLocated(By.className(("username"))));

<强>更新


请试试这个......

driver.findElement(By.id("notifications-page-button")).click();
wait.until(ExpectedConditions.presenceOfElementLocated(By.className(("message"))));

//The code works untill here. But on the next command that clicks messages link, it hangs
driver.findElement(By.id("messages-page-button")).click();
wait.until(driver.findElement(By.id("connections-page-button"))); # changed it to wait for the element that you will next work with

driver.findElement(By.id("connections-page-button")).click();
wait.until(ExpectedConditions.presenceOfElementLocated(By.className(("connections-listview"))));

此外,如果您提供的网页元素的HTML片段,您不确定定位器,我们可以帮助您解决这个问题。