Cef修改元素

Posted 因思道客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cef修改元素相关的知识,希望对你有一定的参考价值。

Cef是不支持DOM的,像webBroswer可以通过DOM直接修改,例如:

HTMLDocument document = WebBrowser.document.all;
HTMLElement element = thedocument.getElementById("ID"); 
element.setAttribute("visible",false);//通过设置属性
element.Style = "display:none";//通过修改样式

但Cef是不支持直接获取document对象的,但可以通过执行JS来实现修改元素
首先注册事件

browser.FrameLoadEnd += new EventHandler<frameloadendeventargs>(Browser_FrameLoadEnd);

然后在事件中添加对应的代码即可,例如:

        private void Browser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
        
            //隐藏对应的ID
            if (HiddenID != "")
            
                var task = e.Frame.GetSourceAsync();
                task.ContinueWith(t =&gt;
                
                    if (!t.IsFaulted)
                    
                        browser.GetBrowser().MainFrame.ExecuteJavaScriptAsync(string.Format("document.getElementById(\'0\').style.display = \'none\';", HiddenID));
                    
                );
            

        

以上

Delphi XE 10.2.3使用CEF4Delphi取网页元素时碰到&nbsp;变问号?的处理

用CEF4Delphi取网页元素时碰到ElementInnerText里含有"&nbsp;"

比如网页源码里是"内容&nbsp;"取出来显示就变成"内容?"

搜索大部分是说把"&nbsp;"替换成其它字符即可

但实际操作怎么也替换不了,就算变量为AnsiString也不行

最后用了以下方法解决

参考网页:

https://blog.csdn.net/qq_29683707/article/details/80860904

关于&nbsp空格转成正常空格‘ ’的方法

 1>先把字符串转码 let data = encodeURI(要转化的值)

 2>接下来替换掉&nbsp空格 data = data .replace(/%C2%A0/g,‘%20‘);
 3>再转回来就ok了 data = decodeURI(data);

要用到encodeURI,找到Delphi版的

http://www.delphitop.com/html/zifuchuan/2599.html

 

方法1
user  Httpapp; 

HttpEncode(AnsiToUtf8(‘中文‘));


方法2
uses
  IdURI;

..
begin
  S := TIdURI.URLEncode(str);
//
  S := TIdURI.URLDecode(str);
end;

使用方法2的TIdURI.URLEncode,程序出错,原因不明

使用方法1成功

直接 TmpTitle:= HTTPEncode(TmpTitle); 即可

但编译器提示警告

[dcc32 Warning] uMiniBrowser.pas(469): W1000 Symbol ‘HTTPEncode‘ is deprecated: ‘Use TNetEncoding.URL.Encode‘
[dcc32 Warning] uMiniBrowser.pas(471): W1000 Symbol ‘HTTPDecode‘ is deprecated: ‘Use TNetEncoding.URL.Decode‘
[dcc32 Hint] uMiniBrowser.pas(469): H2443 Inline function ‘HTTPEncode‘ has not been expanded because unit ‘System.NetEncoding‘ is not specified in USES list
[dcc32 Hint] uMiniBrowser.pas(471): H2443 Inline function ‘HTTPDecode‘ has not been expanded because unit ‘System.NetEncoding‘ is not specified in USES list

 

意思是HTTPEncode和HTTPDecode已经弃用请用TNetEncoding.URL.Encode和TNetEncoding.URL.Decode

点进HTTPEncode看看

function HTTPDecode(const AStr: string): string;
begin
  Result := TNetEncoding.URL.Decode(AStr);
end;

function HTTPEncode(const AStr: string): string;
begin
  Result := TNetEncoding.URL.Encode(AStr);
end;

其实就直接调用了

TNetEncoding.URL.Encode

所在单元是 System.NetEncoding

 


















以上是关于Cef修改元素的主要内容,如果未能解决你的问题,请参考以下文章

cef3开发环境编译(修改navigator.platform)

Cef Browser Wpf 探索 dom,查找元素并更改值

让基于CEF的应用支持自定义协议

Delphi XE 10.2.3使用CEF4Delphi取网页元素时碰到&nbsp;变问号?的处理

c++cef禁止cookie设置

Qt5.9.1结合CEF开发基于chorm的浏览器