我正在尝试使用Selenium Webdriver自动化Sharepoint网站,但无法让我的代码识别新弹出窗口中的元素。
情景如下;在脚本中的某一点,我们点击指向新布告栏项目的链接。将鼠标悬停在此处会给我指针Javascript:OpenPopUpPage('/Lists/Noticeboard/NoticeboardNewFormMain.aspx')
。单击链接时,将显示弹出窗口,并按预期禁用父屏幕。
此时脚本会尝试识别弹出窗口中的第一个元素:
try{
element = driver.findElement(By.xpath("/html/body/form/div[4]/div[1]/div/div[1]/div[2]/div[2]/div[2]/table/tbody/tr/td/div/div/div/div/div[1]/span[1]/table/tbody/tr[2]/td/div[1]/div[3]/span[1]/input"));
}catch(Exception e){
Log.error(sRepositoryName + " | txt_Title not found | Exception desc : "+e.getMessage());
}
return element;
我已经使用Firebug检查了xpath,这对于弹出窗口中的第一个对象是正确的。通过xpath我可以看到没有指定iFrame,因此尝试driver.switchTo().frame(1)
不起作用。
我也尝试过使用driver.getwindowhandles()
,但这只会返回一个窗口,因此无法切换到。
最后,我看到其他人认为它可能只是一个时间问题,因为当脚本检查时,弹出窗体上的元素尚未创建,所以我尝试使用Thread.sleep(15000)
给出时间要生成的弹出窗口,但没有成功。
无论我尝试什么,我仍然会在弹出窗口中找到所有元素的“无法定位元素”异常。有没有人有任何想法如何处理这些弹出窗口?
答案 0 :(得分:0)
弹出窗口正在更改DOM,但您在更改产生影响之前进行查询。
您需要使用Selenium的隐式等待机制:
答案 1 :(得分:0)
似乎我找到了解决方案。
当弹出窗口打开时,它不会打开新帧,但似乎失去了对现有帧的关注。在尝试访问弹出窗口之前我尝试了driver.switchTo().frame(0)
,这很有效。