Ruby 用Selenium单击按钮

Ruby 用Selenium单击按钮,ruby,selenium,rspec,Ruby,Selenium,Rspec,这个问题是我最后一个问题(可以找到)的延续。我现在尝试使用Selenium单击注销按钮时遇到的问题。继续上一篇文章,我试图切换到一个新窗口,通过搜索页面上的注销按钮弹出。我真的很难让Selenium识别那个按钮。以下是我的方法: it "can go to Ultratime", focus: true do @ie_driver.find_element(:link, "My Resources").click sleep 5 @ie_

这个问题是我最后一个问题(可以找到)的延续。我现在尝试使用Selenium单击注销按钮时遇到的问题。继续上一篇文章,我试图切换到一个新窗口,通过搜索页面上的注销按钮弹出。我真的很难让Selenium识别那个按钮。以下是我的方法:

it "can go to Ultratime", focus: true do
   @ie_driver.find_element(:link, "My Resources").click
   sleep 5
   @ie_driver.switch_to.frame(@ie_driver.find_element(:css, 'iframe[src="https://controller.nd.edu/ultratime/insidend/"]'))
   @ie_driver.find_element(:class,"single").click
   @window = @ie_driver.window_handles.detect { |w|
      @ie_driver.switch_to.window(w)
      wait.until { @ie_driver.find_element(:xpath, "//td[class='signbuts']") }
   }
   @ie_driver.switch_to.window(@window)
end
以及我尝试单击的按钮的源代码:

<table class="table" cellspacing="0" cellpadding="0" border="0">
  <tbody>
    <tr style="height:20px">
        <!--hr-->
        <td class="td">
           <button id="signbut" class="signbuts" title="" onblur="buttonBlur(this)" 
           onmouseout="buttonLeave(this)" onfocus="buttonFocus(this)" 
           onmouseover="buttonHover(this)" menuitem="ATW910" 
           onclick="signclick('W' ,'LOGOUT' ,'Logout' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'ATW' ,'910' ,'' ,'' )"></button>
        </td>
        <td class="td">
           <button id="signbut" class="signbut" title="Leave the application"
           onblur="buttonBlur(this)" onmouseout="buttonLeave(this)" 
           onfocus="buttonFocus(this)" onmouseover="buttonHover(this)" menuitem="ATW900"
           onclick="signclick('D' ,'EXITSYS' ,'Quit' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'' ,'ATW' ,'900' ,'' ,'Leave the application' )">
           </button>
        </td>
    </tr>
</tbody>

我展示了两个不同的按钮,只是为了表明我不能简单地寻找按钮id标签(这将使事情变得更容易)。我尝试运行脚本时遇到的错误是“找不到元素”//td[class='signbuts']”,结果它超时


任何帮助都将不胜感激

从错误中可以看出,示例代码没有类名称为
signbuts
td

该类有一个
按钮
!但是,当按类定位元素时,应该使用定位器“classname”。比如:

@ie_driver.find_element(:classname, "signbuts")

注意我不熟悉Ruby,所以语法可能不正确。

解决了这个问题。不知何故,当我检查页面源代码时,该按钮的类名是“signbuts”。当我这样做的时候:

puts @ie_driver.page_source

对于该按钮,它返回一个类名“signbut”。我不知道为什么或者如何改变页面来源,但它确实改变了。只要我用新的类名运行它,它就运行得很好。

在一个页面上多次使用相同的id通常被认为是一个缺陷。和开发人员聊聊。我不能,它是由第三方公司开发的。我只需要用我所拥有的来偿还。其他看过HTML代码的人都认为,为元素提供非唯一id是非常愚蠢的。没错,//td标记完全不起任何作用。我尝试过使用:class(但还没有使用:class\u name)但没有效果。由于上一个问题是由一个iframe组成的,所以我想知道您是否需要对表做一些特殊的处理。我将尝试一下:class_name,看看效果如何。编辑:@SiKing将语法更改为:class_name没有任何好处。它仍然在超时,因为它找不到元素(我添加了一个30秒的wait.until包装,以防它移动太快)。