问题:在做网页获取数据时发现input标签中的数据是通过JS动态传输过来的,不在网页源码中不能使用xpath进行数据获取。
解决:通过执行JS脚本功能获取数据
from selenium import webdriver
def execute_js(chrome_browser: webdriver, js_str: str):
"""
Execute the js.
:param chrome_browser:
:param js_str:
:return:
"""
return chrome_browser.execute_script(js_str)
知识点1:selenium中webdriver对象可以直接使用execute_script(js_str)来执行JS脚本【上面代码可以不用,直接调用execute_script】
知识点2:代码中JS脚本如果想要获得返回值需要加一个 return
contract["变更后金额"] = execute_js(chrome_browser, "return document.getElementsByName('afterMoney')[0].value")
selenium执行JS脚本,首先是定位一个元素,getElementById, getElementByClass, getElementByName等方法但是没有getElementByXpath, 这里补充一下自定义js脚本实现getElementByXpath功能【原文链接:https://blog.csdn.net/wujt8888/article/details/109594246】
select_js = """
function getElementByXpath(path) {
return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
ele = getElementByXpath(arguments[0]);
ele.readOnly = false;
ele.value = arguments[1];
"""
driver.execute_script(select_js, '//*[@id="city"]/div/div/div/input', '北京')