Javascript Ruby Watir语法,用于设置没有id和奇数参数的文本_字段

Javascript Ruby Watir语法,用于设置没有id和奇数参数的文本_字段,javascript,jquery,html,ruby,watir,Javascript,Jquery,Html,Ruby,Watir,我试图在一个不再有id的网页上设置一个文本字段和文本区域。我猜这个网站是在试图避免自动化。输入和文本区域标记位于表单内部。以下是输入和文本区域标记以及包含的内容 <input class="uniform-input ng-pristine ng-invalid ng-invalid-required ng-valid-maxlength" type="text" data-invalid-chars="" data-max-length="50" required="" placehol

我试图在一个不再有id的网页上设置一个文本字段和文本区域。我猜这个网站是在试图避免自动化。输入和文本区域标记位于表单内部。以下是输入和文本区域标记以及包含的内容

<input class="uniform-input ng-pristine ng-invalid ng-invalid-required ng-valid-maxlength" type="text" data-invalid-chars="" data-max-length="50" required="" placeholder="Subject" data-float-label="true" data-ng-model="message.Subject"></input>

<textarea class="uniform-input ng-pristine ng-invalid ng-invalid-required ng-valid-maxlength" data-invalid-chars="" data-max-length="4000" required="" placeholder="Enter your message here" data-ng-keypress="view.error = false" data-float-label="true" data-ng-model="message.Body"></textarea>
另外,在提交带有此按钮标签的文本后,我需要单击一个按钮:

<button data-ng-if="!paymentInfo" type="button" class="button button-grey ng-scope" data-ng-click="ctrl.sendMessage()" data-ng-disabled="view.waiting" data-ng-class="{ 'button-disabled': view.waiting }">Send Now</button>
当它没有名称时,如何单击它

任何关于如何设置与瓦蒂尔这将是非常感谢的帮助。如果Watir无法做到这一点,我是否可以使用JS解决方案?如果需要进一步的帮助,请告诉我。

使用ruby gem watir

require 'watir-webdriver'
$browser = Watir::Browser.new
$browser.goto "yourwebsite.com"

$x = 0
def test
  print "#{$x}"
  begin
   $browser.text_fields[$x].set "#{$x}"
  rescue StandardError => e
   puts " no text field found, try again.\n\n"      
  end
  $x += 1
end

不断更改X的值,以查看正在操作的文本字段。我想你可以做一个循环,但可能会出错。继续调用test,直到找到要查找的内容

元素看起来确实有一些描述性属性。文本字段具有描述该字段的数据ng模型。此外,该按钮的文本可能是唯一的

因此,我想:

browser.text_field(:data_ng_model => 'message.Subject').set('subject text')
browser.textarea(:data_ng_model => 'message.Body').set('body text')
browser.button(:text => 'Send Now').click

我认为这种方法在代码执行方面更具表现力。此外,它还可以更健壮,因为它不受字段被重新排序或其他字段被添加/删除的影响。

我一直在通过xpath识别这些ng数据对象,主要是在没有更具体的方法来识别它们时。Justin关于稳健的方法的看法是正确的;找到一种不需要重构的方法。以下是我想要的:

browser.text_field(xpath: '//input[@data-ng-model="message.Subject"]').set("Hello")
browser.button(:text => 'Send Now').click

我不喜欢使用很多xpath,除非它保证了我在页面上查找对象的唯一方式

这很好,但我遇到了另一个问题,在这些字段后面有一个按钮,我需要使用此html单击:立即发送$browser.buttons[x]。单击“更改x”,并使用正确数量的按钮。也适用于$browser.links[x]。单击感谢您的精彩回答…但按钮似乎不起作用。是否有任何方法可以输出每个按钮…我使用了一个简单的for循环,但什么都没有发生…browser.buttons[I]。单击不起任何作用。我很想帮助您,但我需要查看您尝试自动化的网站。我会在黑暗中盲目射击。您可以尝试使用.css$browser.element:css=>'button[@class=button-button-grey-ng-scope]'。单击感谢您的帮助…现在一切似乎都很顺利。如果您想填充页面上的所有文本输入,可以使用browser.text_-fields.each{| el | el.set-str}。或者,您可以基于类和索引将文本输入作为目标。例如:b.text_字段:index=>0,:class=>uniform input ng pristine ng invalid ng invalid required ng-valid-maxlength.set str