无法使用Selenium Webdriver:Ruby识别和执行Combobox(Sproutcore)上的操作

无法使用Selenium Webdriver:Ruby识别和执行Combobox(Sproutcore)上的操作,combobox,selenium-webdriver,sproutcore,browser-automation,Combobox,Selenium Webdriver,Sproutcore,Browser Automation,我在页面上有一个元素的HTML。它是组合框视图类型,列表是动态的 <div id="sender-combobox" class="sc-view scui-combobox-view sc-regular-size" style="left: 0px; right: 0px; top: 26px; height: 24px"> <div id="sc14188" class="sc-view sc-button-view icon square sc-regular-si

我在页面上有一个元素的HTML。它是组合框视图类型,列表是动态的

<div id="sender-combobox" class="sc-view scui-combobox-view sc-regular-size" style="left: 0px; right: 0px; top: 26px; height: 24px">
  <div id="sc14188" class="sc-view sc-button-view icon square sc-regular-size" style="right: 0px; width: 28px; top: 0px; height: 24px" role="button" alt="" title="">
    <span class="sc-button-inner" style="min-width:80px">
      <label class="sc-button-label ellipsis">
        <img class="caret" alt="" src="data:image/gif;base64,R0lGODlhAQABAJAAAP///wAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==">
      </label>
    </span>
  </div>

  <label id="sc14190" class="sc-view sc-text-field-view oldWebKitFieldPadding sc-hint sc-regular-size" style="left: 0px; right: 28px; top: 0px; height: 22px">
    <span class="border"></span>
      <span class="padding">
        <input class="field" type="text" maxlength="5096" spellcheck="false" placeholder="Set Default Username" value="Set Default Username" name="sc14190">
      </span>
  </label>
</div>
我得到一个错误,没有选择方法。我无法找出原因:是因为元素类型不是组合框,因此Select方法不起作用吗

仅供参考。我在文件中包含了“selenium-webdriver”

作为另一种方法,我将combox声明为两个不同的项目搜索框+按钮,并尝试使用send_keysvalue输入文本,搜索将给出结果。但我无法单击结果


我被困在这一点上。非常感谢您的帮助或指导。

您提供的示例代码没有任何select元素,因此您无法使用select_列表访问它们。这正是错误告诉你的

它是组合框视图类型

不,它不是,因为HTML标准中没有定义这样的类型


您需要通过单击访问所有内容。页面可能是动态构建的,因此每次单击后都必须刷新定位器。查看一个非常类似的问题。

问题在于您或selenium试图将SproutCore控件视为HTML控件。SC生活在JavaScript中,在您和HTML之间有一个厚厚的视图层。在SCUI组合框的示例中,根据,可以在JavaScript视图对象上调用myView.showList-而不是在HTML元素上

由于SproutCore使用JavaScript,您很少会通过查看HTML来找到视图对象,因为这被认为是非常粗糙的。但是,如果有充分的理由或没有其他选项,则可以通过其ID访问视图,该ID与元素上的ID相同。上面包含的HTML表明ComboBox的ID是“sender ComboBox”,这意味着它是用layerId定制的,这是个坏主意;您可以在SC.view.views['sender-combobox']上找到该视图。同样,这被认为是一个坏主意

请注意,如果您自己正在运行代码,例如从控制台运行代码,或者从SC没有响应用户事件(如单击)的任何其他源运行代码,则需要通过使用函数调用SC.run来触发运行循环。否则,SproutCore的绑定和观察器可能赶不上,或者在下一个用户事件之前,其行为可能无法预测

总之,要弹出此视图的下拉列表,可以使用:

SC.runfunction{SC.View.views['sender-combobox'].showList;}


但别忘了,最好以其他方式访问SC.View.views['sender-combobox']。

如果是select元素,如何在HTML中识别?你还提到了点击。我试图点击按钮,现在我需要从列表中选择一个项目。您是想说我需要将该窗格中的所有元素都放入一个散列中,然后遍历每个散列项并在其与我的值匹配时单击吗?Select元素由Select节点标识:单击后迭代所有元素是一个选项。请记住:Selenium模拟人类用户的动作,那么人类用户将如何做呢?为什么在SC视图上定义ID会被认为是错误的?你能详细说明一下吗?我应该说这是一个非常常见的错误源。视图通常一开始是单例的,但后来变成了类;如果开发人员没有意识到或者忘记了到处都是分层,那么就会导致一些很难诊断的问题。使用ID而不是类进行样式设计通常会带来无法量化的性能提升,但这必须非常小心和一致地进行,并且必须与您的整个团队(现在和将来)进行非常响亮的协调。我一般不建议这样做。
select_list(:default_sender, {xpath: "//div[@id='sender-combobox']/div/span/label/img"})

default_sender_element.Select('User1')