我正在使用此代码使用WebBrowser控件填写某些WebPages的字段:
procedure TFrmMain.SetValue(const document: IHTMLDocument2;
const formNumber: Integer;
const fieldName, newValue: string);
var
form: IHTMLFormElement;
field: IHTMLElement;
begin
form := WebFormGet(formNumber, document);
field := form.item(fieldName, '') as IHTMLElement;
if field = nil then
exit;
if field.tagName = 'INPUT' then (field as IHTMLInputElement)
.value := newValue
else if field.tagName = 'SELECT' then (field as IHTMLSelectElement)
.value := newValue
else if field.tagName = 'TEXTAREA' then (field as IHTMLTextAreaElement)
.value := newValue;
end;
但是“SetValue”方法无法填写此WebPage的字段! : http://commenting.iranblog.com/services/commenting/commenting.aspx?BlogID=67436&PostID=754352
SetValue(W.document as IHTMLDocument2, 0, 'name', 'ThisIsANewValueForField');
事实上,我认为这段代码无法找到此网页的字段名称,但我不知道原因!
答案 0 :(得分:1)
名称为“name”的唯一字段是定义为
的字段<input onKeyPress=FKeyPress() id=name onBlur=hideLanguageButton()
onFocus=showLanguageButton(this) maxlength=50 size=50
name=name>
但是这是在页面上唯一表单(表单_ctl0)的结束表单标记(</form>
)之后,因此在技术上不是第一种形式。因此,在页面上加载第一个表单的IHTMLFormElement将不包含“name”字段。
答案 1 :(得分:1)
如果WebFormGet
返回nil
,那么您在该变量上调用一个方法,这肯定会使您的程序崩溃。您没有说您的代码崩溃,因此我们可以假设WebFormGet
成功获取了表单。
但如果WebFormGet
没有返回nil
,那么您永远不会将任何值分配给field
,所以它的编译器分配默认值为nil
。您检查field = nil
是否退出。
因此,我们可以立即得出结论,您现在报告的问题与您正在测试的特定网页完全无关。您的代码将在所有页面上失败。并不是说你的代码不能找到字段;您的代码甚至不会查找字段。
您可能已经在调试器中发现了这个问题。不要害怕使用你拥有的工具。您可以在该过程中设置断点,并一次一行地执行代码。在每一行,确认你所期望的真实是真的。您期望field
引用您命名的字段,但它总是nil
。然后,您可以回顾前面的代码以发现原因。您将查看field
可以获得非空值的所有可能方法,然后找出为什么没有发生这些事情。您最终会仔细仔细地重新阅读您的代码,以发现 无法让field
获得某个值。
如果您解决了该问题,但代码仍无效,请重复相同的过程。使用调试器逐步执行代码,并确保每个步骤都按预期工作。如果它不起作用,请尝试确定失败的原因。