我正在努力使仅在 IE 中工作的应用程序自动化。
步骤是: 1. 转到特定页面并单击搜索按钮。2. 搜索按钮打开一个新的模态弹出窗口 3. 我在弹出窗口中选择了一个公司名称,它关闭弹出窗口并在父窗口中填充所选公司的详细信息。
但是因为没有办法在 IE 中使用 selenium 处理 Modal pop,所以我明确使用了:
((JavascriptExecutor) driver).executeScript("window.showModalDialog =window.open;");
问题是:当 modaldialog 通过我的代码作为窗口打开并且我选择公司时,它会关闭但它不会在父窗口中填充详细信息。
这是打开弹出窗口的按钮的 HTML:
<input id="ctl00_cphMain_ucCustomer_ctlModalBuyerCompany_btnModal" class="FormButton" type="submit" onclick="javascript:ModalCallerCtl_Popup('ctl00_cphMain_ucCustomer_ctlModalBuyerCompany','Please+specify+a+Buyer+Company',1200, 700,'btnModal'); return true;" value="..." name="ctl00$cphMain$ucCustomer$ctlModalBuyerCompany$btnModal">
这是我单击以选择公司名称并关闭弹出窗口的元素的 HTML:
<tr id="SearchxresultsGrid_r_8" level="8" style="height:21px;">
<td id="SearchxresultsGrid_rc_8_0" class="ig_6cb4695_r1 GridRow UltraWebGridRow ig_6cb4695_rc11 FormGridCellText" onmousedown="return igtbl_cancelEvent(event);">
<nobr>
<input class="ig_6cb4695_rcb1112 SelectionSearch btnOpenSite" type="button" tabindex="-1" onclick="igtbl_colButtonClick(event,'SearchxresultsGrid',null, igtbl_srcElement(event));" value="" style="">
</nobr>
我正在遍历窗口并采取行动:
while(i.hasNext())
{
String child = i.next();
if(child!=parent_wnd){
System.out.println(" Child window ----- " + child);
driver.switchTo().window(child);
driver.switchTo().frame("ifrContent");
WebElement SearchBtn = driver.findElement(By.xpath(".//*[@id='Search_GoButton']"));
SearchBtn.click();
Thread.sleep(90000);
util.jsJqWait(driver);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath(".//*[@id='Search_FieldSelect0_txtValue1']")));
/*WebElement txtbox = driver.findElement(By.xpath(".//*[@id='Search_FieldSelect0_txtValue1']"));
txtbox.sendKeys("PHD");
*/
//WebElement btn = driver.findElement(By.id("SearchxresultsGrid_rc_8_0"));
WebElement company_PHD= driver.findElement(By.xpath("//td[@id='SearchxresultsGrid_rc_8_0']/nobr/input"));
//executor.executeScript("var a = document.evaluate(\"//td[@id='SearchxresultsGrid_rc_8_0']/nobr/input\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; return a.onclick=\"igtbl_colButtonClick(event,'SearchxresultsGrid',null, igtbl_srcElement(event))\";");
//executor.executeScript("return document.evaluate(\"//td[@id='SearchxresultsGrid_rc_8_0']/nobr/input\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();");
executor.executeScript("var a = document.evaluate(\"//td[@id='SearchxresultsGrid_rc_8_0']/nobr/input\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; return a.onclick='WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(\"Search$GoButton\", \"\", true, \"\", \"\", false, false)';");
//executor.executeScript("window.addEventListener(\".\"), function('igtbl_colButtonClick(event,'SearchxresultsGrid',null, igtbl_srcElement(event))');");
util.safeJavaScriptClick(company_PHD, driver);
//executor.executeScript("window.opener.igtbl_colButtonClick(event,'SearchxresultsGrid',null, igtbl_srcElement(event));");
//executor.executeScript("jQuery('#company_PHD').click()");
//executor.executeScript(" return window.opener.postmessage(\"return document.evaluate(\"//td[@id='SearchxresultsGrid_rc_8_0']/nobr/input\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();\")");
}
driver.switchTo().window(parent_wnd);
}
忽略代码。它需要重构,因为我只是在检查自动化应用程序的可行性。
任何建议或建议都会有所帮助。我正在寻找的是在 selenium 中使用 JS 在单击时将数据从子窗口发送到父窗口的一些显式方式/代码。我不确定 window.opener 和 postmessage 的用法,因此需要 JS 部分的帮助。