2014-12-07 2 views
1

Я пытаюсь автоматизировать простой процесс для своих клиентов, вызывая сайт, который содержит форму, а затем вставляет несколько значений, которые я уже знаю. Таким образом, пользователю просто нужно заполнить недостающие значения и отправить форму. Что я сделал до сих пор, это запуск IE и переход на сайт, который содержит форму. Я даже могу получить элементы ввода, но я не могу найти способ установить для них значение. Если я попытаюсь установить значение, используя «Значение» в качестве имени свойства/метода, я получаю только «Описание: 80004001/Не реализовано». Я застрял в этой точке.Как установить значение для элементов формы

Использование C# с .NET я в состоянии сделать это, выполнив следующие действия:

SHDocVw.InternetExplorer IE = new SHDocVw.InternetExplorer(); 
IE.Navigate2("http://some.where"); 
var form = IE.Document.Forms(0); 
form.Elements("foo").Value = "bar"; 
[...] 
form.Submit(); 

Но я не совсем уверен, если я использую COM, делая это или какой-то специальный .NET вещи с большим количеством возможностей. Однако - с помощью COM (от Явы - но я не думаю, что это из уместности) Я это до сих пор:

ActiveXComponent xl = new ActiveXComponent("InternetExplorer.Application"); 
Dispatch ie = xl.getObject(); 
Dispatch.invoke(ie, "Navigate2", Dispatch.Method, new Object[] {"http://some.where"}, new int[1]); 
// Now we're at http://some.where 
xl.setProperty("Visible", new Variant(true)); 

// Getting the document 
Dispatch document = Dispatch.get(ie, "Document").getDispatch(); 

// At this point I'm not able to call a property or method called "Elements" 
// like I did with the c# example above. This makes me believe that my c# 
// example is using a more 'integrated' IE-automation as the COM interface does. 
// However, reading MSDN documentation I was a able to find a way to get a few sets further: 

// Retrieving all input-elements 
Dispatch elems = Dispatch.invoke(document, "getElementsByTagName", Dispatch.Method, new Object[] { "input" }, new int[1]).getDispatch(); 

// elems is now a pointer to a collection I can traverse 
// To keep it simple I try to use the first element and do something with it: 
Dispatch elem = Dispatch.invoke(elems, "item", Dispatch.Method, new Object[] { 0 }, new int[1]).getDispatch(); 

// 'elem' is now the first input-Element. To verify I can print out its name (foo): 
System.out.println(Dispatch.get(elem, "name")); 

// However - the following just fails with "Description: 80004001/Not implemented". 
Dispatch.invoke(elem, "value", Dispatch.Get, new Object[] { "test" }, new int[1]).getDispatch(); 

не способ манипулировать HTML-элементов с помощью интерфейса COM ? Если это не так, то мне нужно обернуть этот материал с .NET и называя это из моего кода, который делает .NET выполнения на стороне клиента обязательным, который я пытался избежать ..

Спасибо, Мартин

ответ

1

Try идти через в документе объекта вместо того, чтобы, найти элемент, используя getElementsByTagName (или getElementsById), цикл в коллекции элементов HTML и установить значение, используя SetAttribute, указав значение атрибута

var docu = IE.Document; 
var htmlElements = docu.GetElementsByTagName("inputTagName"); 

foreach (HtmlElement htmlElement in htmlElements) 
    { 
     var name = htmlElement.GetAttribute("name"); 
     if (name != null && name.Length != 0) 
     { 
      htmlElement.SetAttribute("value","Test"); 
     } 
    } 
+0

Отлично! «SetAttribute» работает как шарм. Благодаря! –

+0

Эта проблема все еще в IE 10 –

Смежные вопросы