受限太多,安全第一,坚持Python,又到了选UI的时候了,QT好像不错。
受限太多,安全第一,坚持Python,又到了选UI的时候了,QT好像不错。
因经常接触加密Excel数据文件,密码又难记,所以有此办法
复制下面代码到记事本,另存为 【快捷打开.vbs】 文件
Set args = Wscript.Arguments
FilePath = args(0)
Const Pwd = "xxxxx" '事先知道的Excel文件密码,是打开密码,不是工作簿密码
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.WorkBooks.Open FilePath,0,True,,Pwd
tittle = "JBH Only"
objExcel.Caption = tittle
set ws=createobject("wscript.shell")
ws.appactivate tittle
ws.sendkeys "{enter}"
ws.quit
set ws = nothing
set args = nothing参考下面范例
Sub Xpath定位() 'MSXML2.DOMDocument.6.0
Const str_Html As String = _
"<div id = ""outside"">" & _
"<div id =""box"">" & _
"<div id = ""head"" class = ""color0"">AAA</div>" & _
"<div id = ""body"" class = ""color1"">BBB</div>" & _
"<div id = ""footer1"" class = ""color1"">" & _
"<div id = ""footer2"" class = ""color2"">CCC</div>" & _
"</div>" & _
"</div>" & _
"</div>"
Dim xmlDom As New MSXML2.DOMDocument60 '引用Microsoft xml,v6.0
' Dim xmlDom As Object
' Set xmlDom = CreateObject("Msxml2.DOMDocument.6.0")
If Not xmlDom.LoadXML(str_Html) Then
MsgBox xmlDom.parseError.reason
Set xmlDom = Nothing
Exit Sub
End If
Debug.Print xmlDom.SelectSingleNode("//div/ @ id").Text '根路径下div id
Debug.Print xmlDom.SelectSingleNode("//div/div/ @ id").Text
Debug.Print xmlDom.SelectSingleNode("//div/div[ @ class = ""color1""]").Text
Debug.Print xmlDom.SelectSingleNode("//div/div[ @ id=""body""]").Text
Debug.Print xmlDom.SelectNodes("//div/div/@id")(0).Text
Debug.Print xmlDom.SelectNodes("//div/div/@id")(2).Text
Debug.Print xmlDom.SelectNodes("//div/div[@id=""footer2""]")(0).Text '只有一个结果
Debug.Print xmlDom.SelectNodes("//div [@id=""box""] /div [@class=""color1"" ] ")(0).Text
Debug.Print xmlDom.SelectNodes("//div/div/@id")(0).XML
Set xmlDom = Nothing
End Sub两种方式,一种需要本机Outlook配置好的,一种不需要,使用CDO
一、Outlook模式
该模式需要你电脑中有正常使用的Outlook,不是装了软件就可以了,要配置好正常能用
用例
Sub test()
Set mm = New MailForOutlook
s = mm.GenerateEmail("gnefnuy@qq.com", "主题:测试", "<b>加粗</b><br>测试", True)
End Sub用例,VBA的环境是GB2312的,直接MD5中文字符出来的会与实际通用的UTF8字符数据不一致,所以要先转UTF8再MD5
Sub test() Dim f As New MD5 Dim s As String s = "中文字" Debug.Print "ANSI:" & f.DigestStrToHexStr(s) Dim a() As Byte, b() As Byte a = s Debug.Print "GB2312:" & f.DigestByteToHexStr(a) Debug.Print "GB2312-UTF8:" & f.DigestByteToHexStr(Unicode_To_UTF8(a)) '这里的数据和网上在线MD5验证网站一致。 b = StrConv(s, vbFromUnicode) Debug.Print "ANSI-UTF8:" & f.DigestByteToHexStr(Unicode_To_UTF8(b)) End Sub
好多限制,Python一句话能解决,不想多说,浪费时间精力
有时候还是用油猴方便,WebDriver考虑的太多
//获取元素,一直查询,直到找到为止,参数名称比较好理解
function getElement(parent, selector, timeout = 0) {
return new Promise(resolve => {
let result = parent.querySelector(selector);
if (result) return resolve(result);
let timer;
const mutationObserver = window.MutationObserver || window.WebkitMutationObserver || window.MozMutationObserver;
if (mutationObserver) {
const observer = new mutationObserver(mutations => {
for (let mutation of mutations) {
for (let addedNode of mutation.addedNodes) {
if (addedNode instanceof Element) {
result = addedNode.matches(selector) ? addedNode : addedNode.querySelector(selector);
if (result) {
observer.disconnect();
timer && clearTimeout(timer);
return resolve(result);
}
}
}
}
});
observer.observe(parent, {
childList: true,
subtree: true
});
if (timeout > 0) {
timer = setTimeout(() => {
observer.disconnect();
return resolve(null);
}, timeout);
}
} else {
const listener = e => {
if (e.target instanceof Element) {
result = e.target.matches(selector) ? e.target : e.target.querySelector(selector);
if (result) {
parent.removeEventListener('DOMNodeInserted', listener, true);
timer && clearTimeout(timer);
return resolve(result);
}
}
};
parent.addEventListener('DOMNodeInserted', listener, true);
if (timeout > 0) {
timer = setTimeout(() => {
parent.removeEventListener('DOMNodeInserted', listener, true);
return resolve(null);
}, timeout);
}
}
});
}