Sử dụng mã java-script trong Mathematica

Sep 04 2020

Tôi có tệp HTML sau được lưu trữ trên "C: \ local.html":

<html>
<head>
<script type="text/javascript">

function execute()
{
    const urlParams = new URLSearchParams(window.location.search);
    const param = urlParams.get('param');
    var text_box = document.getElementById("path_text");
    text_box.value = param;
}

</script>

</head>
<body onload="execute()">

<textarea id="path_text" rows="40" cols="80" style="font-size:75%"></textarea><br/>

</body>
</html>

Nếu tôi mở tệp trong trình duyệt web của mình như "tệp: /// C: /local.html? Param = Một số văn bản thú vị" Tôi nhận được trang web có vùng văn bản chứa văn bản "Một số văn bản thú vị" đã được chuyển đến java-script theo biến URL param.

Bây giờ tôi muốn nhập cùng một tệp vào Mathematica với cùng một tham số URL và sau đó trích xuất nội dung textarea id="path_text"sau khi tập lệnh java được thực thi.

Đoạn mã sau

Import["file:///C:/local.html?param=some dfsf"]

đưa ra lỗi "Không tìm thấy tệp".

Hai mã sau không có lỗi nhưng cũng không cung cấp dữ liệu, chẳng hạn như mã java-script không được thực thi hoặc / và tham số URL không được truyền.

Import["file:///C:/local.html", 
 Parameters -> {"param" -> "Some interesting text"}]

Import["C:\\local.html", 
 Parameters -> {"param" -> "Some interesting text"}]

Làm cách nào để nhập tệp HTML cục bộ với các tham số URL được chuyển vào java-script và java-script được thực thi?

CẬP NHẬT:

Sử dụng lời khuyên của flipnty để sử dụng StartWebSessionvà WebExecutetôi đã tìm ra cách trích xuất nội dung từ vùng văn bản bằng mã java-script:

session = StartWebSession[Visible -> False];
WebExecute[
  "OpenPage" -> "file:///C:/local.html?param=Some interesting text"];
WebExecute[session, 
 "JavascriptExecute" -> 
  "return document.getElementById('path_text').value"]
DeleteObject[session]
Clear[session]

(*"Some interesting text"*)

Trả lời

3 flinty Sep 04 2020 at 16:07

Tôi có thể tải trang bằng Firefox và lấy phần tử. Nhưng tôi không nghĩ rằng Wolfram đã triển khai các thuộc tính giải nén thông qua XPath. Sử dụng "JavascriptExecute"công trình tuy nhiên.

session = StartWebSession[Visible -> False];
WebExecute[session, {
  "OpenPage" -> "file:///C:/local.html?param=some%20dfsf"
}]

(* here we try to get the element and it works *)
e = WebExecute[session, {
  "LocateElements" -> "XPath" -> "//*[@id='path_text']"
}]

(* here we try to get the .value attribute, but it won't work and returns {{}}.
 This XPath query doesn't even work in the Firefox console either. *)
a = WebExecute[session, {
  "LocateElements" -> "XPath" -> "//*[@id='path_text']/@value"
}]

(* we can try to execute js on the page to extract the attribute, this works *)
result = WebExecute[session, 
  "JavascriptExecute" -> "return document.getElementById('path_text').value"]

DeleteObject[session]