selenium - 在 selenium 的不同选项卡中下载 PDF 文件以 URL 形式打开
问题描述
设想:
我有一个应用程序,比如说 A:当我们登录到 A 时,我们有一个链接说 B 点击它将打开一个新的浏览器。在浏览器 B 中,我们有一个可以打开 pdf 的链接。一旦单击 PDF 在我们打开页面 A 的第二个选项卡中作为 URL 打开。
问题:
我尝试通过窗口句柄使用迭代进行切换,但没有找到。我还尝试在下面添加以找到您在定位器下方的所有窗口句柄。
if(driver.findElement(By.xpath("//*[@id="plugin"]")))
但由于 PDF URL 已在第二个选项卡中打开,我无法获取窗口句柄。我想根据我下面的代码,如果我得到 Window 句柄,那么我将使用机器人类并保存 PDF。
注意:我使用的是 xframium 框架,所以必须定义 WebDriver driver = getCustumWebDriver(); 我只能使用 IE/Chrome 而不能使用其他浏览器
有关如何解决的任何建议?
代码:
public String getWindowUrl(String saveDir, SoftAssert softAssert, Element element) {
boolean success = false;
String newWindowUrl = null;
try {
WebDriver driver = getCustumWebDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
//current window handle
String beforWindowHandle = driver.getWindowHandle();
_wait(2000);
//Click on the element to which the pdf link is opened
_click(element);
waitForPageLoad();
_wait(30000);
Set<String> allWindowhandles = driver.getWindowHandles();
for(String handle1 : allWindowhandles)
{
if(!handle1.equals(beforWindowHandle))
{
driver.switchTo().window(handle1);
_wait(2000);
newWindowUrl = driver.getCurrentUrl();
docName = newWindowUrl.replaceAll("[^0-9]+", "");
docName = saveDir.concat(docName).concat(".pdf");
Robot rb = new Robot();
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_S);
_wait(3000);
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_C);
rb.keyRelease(KeyEvent.VK_C);
rb.keyRelease(KeyEvent.VK_CONTROL);
_wait(1000);
rb.keyPress(KeyEvent.VK_HOME);
rb.keyRelease(KeyEvent.VK_HOME);
_wait(3000);
StringSelection stringSelection = new StringSelection(saveDir);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, stringSelection);
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_CONTROL);
rb.delay(3000);
// _wait(3000);
rb.keyPress(KeyEvent.VK_ENTER);
rb.keyRelease(KeyEvent.VK_ENTER);
_wait(2000);
}
}
success = true;
driver.close();
}
场景 2:我可以强制应用程序为 PDF 打开一个新的浏览器窗口,但我无法进入将打开新 PDF URL 的特定窗口。我将尝试以下方法并给出我的观察:
**for(String handle1 : allWindowhandles)
{
// change focus to new tab
driver.switchTo().window(handle1);
if(!(driver.findElement(By.id("Element that will be present on browser window 1 - A ")).isDisplayed()||
driver.findElement(By.id("Element that will be present on browser window 2 - B ")).isDisplayed()))
{
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_S);
_wait(3000);
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_C);
rb.keyRelease(KeyEvent.VK_C);
rb.keyRelease(KeyEvent.VK_CONTROL);
_wait(1000);
rb.keyPress(KeyEvent.VK_HOME);
rb.keyRelease(KeyEvent.VK_HOME);
_wait(3000);
StringSelection stringSelection = new StringSelection(saveDir);
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, stringSelection);
rb.keyPress(KeyEvent.VK_CONTROL);
rb.keyPress(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_V);
rb.keyRelease(KeyEvent.VK_CONTROL);
rb.delay(3000);
// _wait(3000);
rb.keyPress(KeyEvent.VK_ENTER);
}**
解决方案
据我了解,您所指的该应用程序的开发人员已配置在新选项卡中启动 pdf。因此我们无法在同一选项卡中打开它,因为它已在应用程序标签中配置。
推荐阅读
- graphql - 如何将共享到 GraphQL Bin 选项添加到我的 Apollo 服务器游乐场?
- .net - 使迭代器函数在抛出异常时返回空引用
- javascript - Javascript:如何将两个对象合二为一
- node.js - Electron 和 React 组件中的通信
- react-native - 反应导航:按下后退按钮时状态保持不变
- reinforcement-learning - Q 学习二十一点,奖励功能?
- react-native - React Native Navigation 不同的动画取决于来源
- html - 在 html 页面上加载工具提示时出现问题
- delphi - Delphi中的Producer和ProducerContent有什么区别?
- c - 诸如全局整数之类的宏在内存中存储在哪里?