我正在尝试自动输入用户名,密码然后点击提交以使用无头浏览器登录网页,但文本框webelement的html代码在网页上不可见。
使用带有无头浏览器HtmlUnitDriver的selenium webdriver,我试图对嵌套在其中的webelement执行findElementBy。当我直接从网页查看HTML时,正文如下所示。当我使用谷歌浏览器调出开发人员工具时,我可以看到文本框(webelement)的html代码(看起来像我想要找到的)嵌套在标签中。有没有什么方法可以找到嵌套在这些div标签中的文本框webelement,以便我可以使用selenium输入我的用户名?
我试图研究几种方法,比如使用JavascriptExecutor来扩展从网页返回的html中div的内容但是没有用,也许我写了错误的javascript。我也尝试过Jsoup,但是Jsoup解析函数需要将html解析为String,而不是文档(包含我可以找到并输入文本的webelements的网页)。
我还应该注意,在下面扩展名为.js的文件中,我做了一个ctrl + f来查找example2.js中的“gui-view”,“username”和“password”等字样
<body>
<div gui-view></div>
<script src="example1.js" type="text/javascript"></script>
<script src="example2.js" type="text/javascript"></script>
<script src="//some.path.net/example3.js"></script>
<script>try{TipK.load();}catch(e){}</script>
</body>
</html>
答案 0 :(得分:1)
阅读您的评论我认为您需要修改您对元素所在位置的理解。所有元素都存在于浏览器内存中的DOM中。它们都在浏览器中。绝对没有任何元素存在于服务器上。如果您不确定DOM是什么,请将其视为您在浏览器中看到的页面。
浏览器DOM处于活动状态。元素可以来去匆匆。浏览器有一个运行的javascript引擎。从服务器发送的Javascript文件向引擎提供有关如何更改DOM的说明。
当Selenium抛出NoSuchElement异常时,它是因为它无法在DOM中找到该元素。它没有查找任何文件。你不需要给它任何文件。您只需要在浏览器DOM中以正确的状态显示它。
在您的情况下,只有当用户点击第一个“登录”链接时,才会在用户名元素上附加一个javascript事件。您需要触发该事件以显示用户名元素。要了解如何执行此操作,在您手动执行页面上的操作时按照您自己的思维过程。即确保单击“登录”链接,以便显示用户名字段。如果你没有看到它就无法输入用户名,那么Selenium也不能。
请注意您使用哪个开发人员工具来查看DOM。 页面源显示发送到浏览器的原始html。它不是DOM的全貌。如果使用javascript在页面上构建任何元素,则不会在页面源中看到这些元素。
要查看活动DOM的html,请改用 Inspect Element 。
现在你已经分享了网址,我们可以看到网页的完整html。如其他答案中所述,您需要:
By.xpath("//a[@id='memberFunction']")
以显示用户名和密码字段By.xpath("//input[@id='username']")
By.xpath("//input[@id='password']")
By.xpath("//a[@id='signinSubmit']")
答案 1 :(得分:0)
对我来说,很明显(使用Firefox的FirePath插件)你不能用Selenium输入用户名,除非你做了类似下面的伪代码: