使用Java的Selenium:使用class属性搜索按钮失败;相反,成功使用标题属性

时间:2018-08-31 11:46:38

标签: selenium

我在网页中有一个按钮元素

<button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only ui-dialog-titlebar-close" role="button" title="Close">
    <span class="ui-button-icon-primary ui-icon ui-icon-closethick"></span> 
    <span class="ui-button-text">Close</span>
</button>

我正在尝试使用以下Xpath找到它:"//button[@class = 'ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only ui-dialog-titlebar-close']"

仅当我选择查看页面中的项目时,此按钮元素才会出现。页面内有多个项目;所以我需要在关闭一个已经打开的窗口之后一一打开。

我需要多次使用Xpath进行操作

btnWorkItemClose = bla.elementByXpath("//button[@class = 'ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only ui-dialog-titlebar-close']");
btnWorkItemClose.click();
backlogGrid.sendKeys(Keys.ARROW_DOWN);  
backlogGrid.sendKeys(Keys.ENTER);
doSomeFuntionWithTheWorkItem();
btnWorkItemClose = bla.elementByXpath("//button[@class = 'ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only ui-dialog-titlebar-close']");
btnWorkItemClose.click();

该元素在第一个实例中成功定位,但在第二个用法中未成功定位。我有例外

  

“没有这样的元素:无法找到元素:{” method“:” xpath“,” selector“:” // button [@class ='ui-button ui-widget ui-state-default ui-corner-全部仅ui-button-icon ui-dialog-titlebar-close']“}”]

注意:当我在网页中手动使用Xpath时,它可以准确地找到该元素,并且尝试了不同的等待方法,但都没有帮助。

但是,当我使用Xpath "//button[@title= 'Close']"时,两个实例都可以正常工作。

您能告诉我这里发生了什么吗?

2 个答案:

答案 0 :(得分:0)

我认为无需从第二次点击中删除

btnWorkItemClose = bla.elementByXpath("//button[@class = 'ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only ui-dialog-titlebar-close']");

我尝试仅在其正常工作后才能定位

答案 1 :(得分:0)

对于xpath,class是一个属性,值作为字符串进行比较。 这意味着@class = 'class1 class2'不等于@class = 'class2 class1',在您的情况下可能是问题所在。这里举例说明如何找到更有效的元素:
-CSS选择器:button[title='Close']
-CSS选择器:button.ui-dialog-titlebar-close.ui-widget,在这里您可以根据需要添加任意数量的类
-xpath:.//button[contains(@class='ui-dialog-titlebar-close'],或者如果您需要使用更多的类而不用担心它们的顺序,请参见以下示例:
.//button[contains(@class,'ui-dialog-titlebar-close') and contains(@class,'ui-widget')]

第二个问题,如果要使用 xpath 获取内部元素,则将.放在细节(https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html)的开头。如果您在所有DOM中而不是在bla中搜索按钮元素。这是使用xpath在bla元素内查找关闭按钮的正确方法:

btnWorkItemClose = bla.elementByXpath(".//button[contains(@class,'ui-dialog-titlebar-close') and contains(@class,'ui-widget')]");