python selenium3 取回js执行结果 取回文本框内容 无法返回JS执行结果


python2记录一个日常中解决的问题,老规矩,基础知识在前,步骤在最后,可以直接看最后。

--------基础知识-----------

环境:python3  selenium3

python写的数据采集,对一般有规律的页面用 自带 + BeautifulSoup + 正则就可以搞定。但是也有比较复杂的情况,

例如:页面的内容是通过js生成,通过js跳转的,或者整个页面使用了大量js完成操作;对这种涉及页面脚本解析的内容,用前面的方法会异常吃力。

所以我们通常会使用游览器直接解析以及运行js。并通过python selenium完成程序与浏览器的交互。游览器的选择推荐使用 phantomjs 特点是,无头也就是无界面。当然,也可以使用chrome 或者 firefox 好处是,看的到执行步骤。

简单来说:selenium可以操作页面的元素,并且提供执行js脚本的接口。

一般执行方式有两个

execute_script()是同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕;
execute_async_script()方法是异步方法,它不会阻塞主线程执行。

如果要取结果,我们肯定使用第一个 execute_script()

execute_script() 方法如果有返回值,有以下几种情况:

如果返回一个页面元素(document element), 这个方法就会返回一个WebElement
如果返回浮点数字,这个方法就返回一个double类型的数字
返回非浮点数字,方法返回Long类型数字
返回boolean类型,方法返回Boolean类型
如果返回一个数组,方法会返回一个List<Object>
其他情况,返回一个字符串
如果没有返回值,此方法就会返回null

-------------正文开始-------------

问题:文本框的内容是用户自己输入的。通过JS执行后。无法取回结果

例如:

js = "document.getElementById('txtSearch').value;"
a = driver.execute_script(js)
实验后我们会发现。其实JS得到了执行,比如给value 赋值。确实页面上会变化。说明定位以及执行是正常的。
而且我们也知道。执行是会有返回指的。但是用 print(type(driver.execute_script(js)))打印结果类型。会提示 无类型。
问题的答案在于。如果需要返回值,需要在js 的前面加上return
例如:
js2 = "return document.getElementById('txtSearch').value;"
print(type(driver.execute_script(js2)))

这样一切就正常了。返回就是str 类型了。也就是可以得到js执行的结果了。
备注:

普通的文本框,也就是在HTML层面的内容。直接使用各种定位之后使用.text 即可

例如:

driver.find_element_by_id('你所选定的ID').text
driver.find_element_by_class_name('你所选定的name').text

 

 

 

声明:敏淳|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - python selenium3 取回js执行结果 取回文本框内容 无法返回JS执行结果


流茗天地外,人间二十年。