getElementById sur l'élément à l'intérieur d'une iframe
Mon code fonctionne sur les éléments à l'extérieur d'un iframe. Comment devrais-je m'approche d'extraction des éléments dans un iframe à l'aide getElementById? Mon objectif final est d'écrire du texte à l'intérieur de la <body id="tinymce"><p>...</p></body>
balises. Je ne suis pas à l'aide d'un contrôle webBrowser - c'est pour une instance externe de iexplore
Exemple de code HTML
Exemple De Code
foreach (InternetExplorer ie in new ShellWindowsClass())
{
if (ie.LocationURL.ToString().IndexOf("intranet_site_url") != -1)
{
IWebBrowserApp wb = (IWebBrowserApp)ie;
while (wb.Busy) { Thread.Sleep(100); }
HTMLDocument document = ((HTMLDocument)wb.Document);
//FETCH BY ID
IHTMLElement element;
HTMLInputElementClass hitem;
element = document.getElementById("tinymce");
hitem = (HTMLInputElementClass)element;
hitem.value = first_name;
//FETCH BY ID in IFRAME
IHTMLFramesCollection2 hframes = document.frames;
for (int i = 0; i < hframes.length; i++)
{
object ref_index = i;
IHTMLWindow2 currentFrame = (IHTMLWindow2)hframes.item(ref ref_index);
if (currentFrame != null)
{
MessageBox.Show(currentFrame.name);
//what to do from here?
}
else
MessageBox.Show("Null");
}
}
}
- mise à jour idée
Possibilité d'adapter mon idée ci-dessous?
if (currentFrame != null)
{
MessageBox.Show(currentFrame.name);
HTMLDocument document_sub = ((HTMLDocument)currentFrame.document);
IHTMLElement element_sub;
HTMLInputElementClass hitem_sub;
element_sub = (document_sub.getElementById("tinymce"));
hitem_sub = (HTMLInputElementClass)element_sub;
try
{
hitem_sub.value = first_name;
//the above will produce...
//InvalidCastException: Unable to cast COM object of type 'mshtml.HTMLBodyCLass' to class type 'mshtml.HTMLInputElementClass'
}
catch { }
}
Est le sous-châssis dans une autre origine que le document parent? Si oui, vous ne pouvez simplement pas atteindre et saisir son objet document en raison de la façon dont le SameOriginPolicy de restriction a été mise en œuvre. Au lieu de cela vous devez saisir le sous-châssis à l'aide de son IOleContainer interface...
Non, même origine - c'est exactement comment il est indiqué ci-dessus dans l'exemple de code html. Je n'ai jamais vu TinyMCE présenté dans le balisage de cette façon et il ne fait pas de sens pour moi, mais j'ai de travailler avec elle.
il pourrait être plus facile d'injecter un peu de JavaScript pour obtenir l'élément DOM vous avez besoin, comme ceci (à l'origine de la ici). Vous devriez être capable de faire la même chose en C# à l'aide de
peut-être cette réponse est utile pour vous : stackoverflow.com/q/35651305/3555828
Non, même origine - c'est exactement comment il est indiqué ci-dessus dans l'exemple de code html. Je n'ai jamais vu TinyMCE présenté dans le balisage de cette façon et il ne fait pas de sens pour moi, mais j'ai de travailler avec elle.
il pourrait être plus facile d'injecter un peu de JavaScript pour obtenir l'élément DOM vous avez besoin, comme ceci (à l'origine de la ici). Vous devriez être capable de faire la même chose en C# à l'aide de
dynamic
.peut-être cette réponse est utile pour vous : stackoverflow.com/q/35651305/3555828
OriginalL'auteur Patrick Alexson | 2013-08-27
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Qui obtient l'image et le traite comme un document différent (parce que c'est bien) et puis il tente d'obtenir l'élément à partir de son id. Bonne chance.
Edit: Cela devrait faire l'affaire, en prenant avantage de la
dynamic
type de données, etInternetExplorer
interface:foreach (InternetExplorer ie in new ShellWindowsClass()) { if (ie.LocationURL.ToString().IndexOf("intranet_site_url") != -1) { // code in original post starts here } }
Donc, si je comprends bien, j'ai besoin de traiter les marques dans une iframe comme un nouveau document. Pourrais-je l'utiliser quelque chose comme dans la mise à jour je viens de faire sur le post original?désolé, j'étais parti. Je vais prendre un coup d'oeil maintenant.
vérifier mon montage. Il a travaillé sur la TinyMCE site, je pressume il devrait fonctionner sur votre site local. Je vais favorite de cette question, parce que c'est quelque chose qui pourrait être utile à l'avenir 😉
Merci pour l'aide! Les cadres n'est pas disponible, voir: http://imgur.com/UkiAhJP
dynamic
ne fonctionne pas pour Internet Explorer interfaces marshalé out-of-process. Cela peut être fait à l'aide de IDispatchEx bien que.OriginalL'auteur Hanlet Escaño
Cette réponse a été inspiré par certains travaux de recherche que j'ai fait récemment sur l'utilisation de eval pour insérer un script dans un out-of-process instance d'Internet Explorer.
L'idée est de contourner MSHTML DOM l'interopérabilité des interfaces et de l'utilisation dynamique de JavaScript pour obtenir un objet DOM d'intérêt. Il y a un certain nombre de conséquences:
WebBrowser
de contrôle, standard Type.Invoquer, HtmlDocument.InvokeScript ou dynamic invocation fonctionnent très bien avec cette technique).De répondre à la question elle-même, il devrait être assez facile pour obtenir les
body
élément, à l'aide de l'approche illustré ci-dessous:Voici un exemple qui exécute
alert(document.URL)
dans le contexte d'un enfant de cadre dejsfiddle.net
, par l'automatisation d'un out-of-process instance deInternetExplorer.Application
:OriginalL'auteur noseratio
Explorer l'attribut sandbox.
http://www.w3schools.com/tags/att_iframe_sandbox.asp
w3fools.com
developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe
J'en suis très conscient de w3schools invalidité, mais le plus souvent c'est assez précise.
OriginalL'auteur Someone
Aussi un autre moyen serait d'obtenir l'url de l'iframe et les charger dans votre navigateur.
Pour moi la solution retenue est de donner
"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))"
erreur.OriginalL'auteur Vepa Durdiyev