您好:我正在使用Selenium / Java从网站上获取PDF。该网站不会提前生成它们,但只有在我碰到链接后才能生成它们。当我这样做时,网络服务器就会消失几分钟,然后再返回内容。
我正在使用Firefox及其内置的PDF查看器。当我从主浏览器窗口单击下载链接时,它会打开另一个窗口来接收PDF内容。在几分钟内,子窗口充满了PDF内容,我需要做的就是单击Firefox工具栏上的下载按钮,然后按保存按钮在confimration对话框中。我有时成功完成了这两件事。
当我执行代码点击子窗口的下载按钮时,我的问题有时会出现 ...
WebElement element = driver.findElement(By.id(“download”));
element.click();
有时,它只是不起作用。声明:
driver.findElement(By.id( “下载”))
...永远不会抛出异常,因此总是成功。然而,随后的element.click()通常不会产生预期的结果。
我已经在这个问题上投了大约100个飞镖,但我似乎找不到能产生一致结果的飞镖。我试过引入延迟,多次调用findElement,试图在子窗口上使用驱动程序来确认它与该窗口的连接(所有都带有正返回值),但似乎没有任何东西可以帮助生成element.click()成功的下载链接。
我发现Selenium是一个坚如磐石的解决方案,尤其是在通过主窗口工作时...它从不会错过任何一个节拍,我对这种行为印象非常深刻。这是我的第一个Selenium项目,我希望有人更多地使用它,可能会对这个特定问题提出建议。
答案 0 :(得分:1)
如果没有关于子窗口如何填充的其他信息,很难回答这个问题。如果子窗口使用javascript将按钮添加到页面并定义其行为(很可能),那么当您查找它时,该元素可能实际存在于页面上(即不会抛出任何错误),但它可能尚未激活或准备被点击。
在子页面的源代码中查看元素定义可能是一个好主意,以便更好地了解按钮的编码方式。如果您可以访问更好地设计/实现按钮的Web开发人员。如果您可以等到执行单击操作,直到按钮处于所需状态,这应该可以解决问题。
此外,如果使用像Angular这样的动态框架对页面进行编码,那么最好使用Protractor进行测试,这是基于Selenium,但是在视图中发生更新时会知道它们的更新