1

我现在真的被困住了。我有一个 iframe,其中有一个 <p> 标签,我想在其中发送一些文本,但我就是做不到。

HTML:

<iframe id="edit-field-verdict-0-value_ifr" frameborder="0" src="javascript:""" style="width: 100%; height: 100px;">
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  <html>
    <head xmlns="http://www.w3.org/1999/xhtml">
    <body id="tinymce" class="mceContentBody " spellcheck="false" dir="ltr">
      <p>
        <br mce_bogus="1">
      </p>
    </body>
    </html>
</iframe>

我尝试过的代码是:

@browser.elements(:xpath => '//*[@id="tinymce"]').p.send_keys [:control, 'a']

我得到的错误是:

undefined method `elements' for #<String:0x24ba570> (NoMethodError)

我也试过

$browser.frame(:id,'edit-field-verdict-0-value_ifr').html.body(:id,'tinymce').p.send_keys [:control, 'a']

但由于 Watir 无法识别身体,我也尝试elements_by_xpath过。它没有用。

我怎样才能使这件事起作用?

4

1 回答 1

4

对于第一次尝试,错误消息说这@browser是一个字符串而不是 Watir::Browser 对象。您应该验证@browser设置是否正确。根据您的第二个示例,它可能是全局变量$browser

对于第二次尝试,bodyWatir 支持。但是,html将返回页面的 html 而不是 html 元素。鉴于应该只有一个 body 元素,该html元素可以省略。

$browser.frame(:id,'edit-field-verdict-0-value_ifr').body(:id,'tinymce').p.send_keys [:control, 'a']

但也请记住,您只需要包含 frame 方法(告诉 watir 查看框架内部),并且只需包含可靠地找到您正在与之交互的元素所需的量。任何额外的东西只会让代码更冗长,也可能让事情变得更脆弱、更容易被破解。所以上面可以缩短到只是

$browser.frame(:id,'edit-field-verdict-0-value_ifr').p.send_keys [:control, 'a']

根据您正在测试的元素的 id,我假设它是 WYSIMYG 编辑器。您应该查看 Watir-Webdriver 页面以获取示例 - http://watirwebdriver.com/wysiwyg-editors/。网页中的 TinyMCE 编辑器示例:

require 'watir-webdriver'
b = Watir::Browser.new
b.goto 'http://tinymce.moxiecode.com/tryit/full.php'
b.execute_script("tinyMCE.get('content').execCommand('mceSetContent',false, 'hello world' );")
b.frame(:id => "content_ifr").send_keys 'hello world again'
于 2013-04-17T14:12:27.543 回答