python中的Firefox + Selenium:如何以交互方式获取元素html?

时间:2014-01-22 22:26:51

标签: javascript python selenium splinter

我正在使用Python + Selenium + Splinter + Firefox来创建交互式网络爬虫。

python脚本提供选项,然后Selenium打开Firefox并发送一些订单。

现在,我需要让python脚本知道用户想要与之交互的web元素。

我目前使用的 方法 是:

  

右键单击网站中的项目(Firefox),单击“检查”   元素',然后单击Firefox检查器,单击'复制HTML',然后   手动将其提供给脚本,然后就可以继续了。

但是出于显而易见的原因,我觉得这个过程远非完美。

我对javascript一无所知,但在阅读other questions之后,我觉得javascript实际上可以成为解决方案。

Splinter允许运行javascript并将返回的值提取到python脚本中,因此,理论上:

是否可以运行一个javascript代码,该代码将返回用户点击的下一个元素的html代码?那么命名的 方法 只会右键单击所需的元素?


澄清Amey的评论:

python脚本打开一个Firefox窗口,该控件仍然保留在脚本中。 使用splinter,可以执行javascript代码并在完成/返回信息时等待。 这意味着python脚本可以要求用户在其拥有的Firefox窗口中单击或右键单击,因此目标是启动一个“捕获”用户单击的元素的javascript。

这是否足以让javascript捕获所需的元素?

1 个答案:

答案 0 :(得分:1)

这是一个有趣的问题。我的策略是使用Javascript将侦听器添加到您要定位的元素。由于您没有指定哪些类型的元素,我使用了链接。这可以很容易地适应。

单击某个元素时,侦听器会创建一个带有您指定ID的新页面元素,并将value属性设置为相关信息。

然后,假设您已设置driver.implicitly_wait,您可以等待元素出现。

driver.execute_script("for(var i = 0; i < document.links.length; i++){document.links[i].onclick = function clicked(){var e = document.createElement('a'); e.setAttribute('id','myUniqueID'); e.setAttribute('value', this); document.getElementsByTagName('body')[0].appendChild(e);};}")

clicked = driver.find_element_by_id('myUniqueID').get_attribute('value')