无法使用Selenium在SmartGWT应用程序中找到元素

时间:2017-09-06 05:57:19

标签: java selenium selenium-webdriver gwt smartgwt

我是Selenium和GWT的初学者,我正在尝试测试像Paint这样添加SmartGWT库的GWT Web应用程序。我遇到了一个问题,试图用一种方法找到网页的元素,这将与所有浏览器兼容。我尝试了很多方法来定位元素,但没有一个方法有效。首先,我尝试使用不起作用的ID来定位元素。然后,我尝试了绝对XPath的方法,它不适用于不同浏览器上的一些元素。然后,我尝试使用相对XPath定位这些元素但不幸的是,该方法也出现了同样的问题。然后,我找到了另一种使用此链接中给出的scLocators定位这些元素的方法:Using Selenium in SmartGWT

我能够使用此链接中提到的步骤在Selenium IDE中生成scLocators。但是当我在停止录制后在Selenium IDE中播放整个测试用例时,IDE本身无法找到它在我执行各种操作(如单击,写入文本等)时生成的元素。 p>

此外,我还使用scLocators在Java中使用Selenium WebDriver查找这些元素。但同样,它没有起作用,并且没有显示任何此类元素。

这是我的代码。

public class RelativeXpath {

public static void main(String[] args) throws InterruptedException {
    System.setProperty("webdriver.chrome.driver", "D:\\SELENIUM\\Drivers\\chromedriver.exe");
    SmartClientWebDriver driver = new SmartClientChromeDriver();
    driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
    Thread.sleep(3000);
    driver.get("xxxxxx"); //here I have given the URL of my web application
    WebDriverWait wait = new WebDriverWait(driver, 10);
    wait.until(ExpectedConditions.titleContains("XXXX")); // here I've given the title of my web application
    wait.until(ExpectedConditions.elementToBeClickable(By.id("frontCanvas")));
    Thread.sleep(4000);
    WebElement Draw = driver.findElement(ByScLocator.scLocator("//HLayout[ID=\"long_ribbon_HLayout\"]/member[Class=IconMenuButton||index=1||length=20||classIndex=0||classLength=4||roleIndex=0||roleLength=15||scRole=button]/icon"));
    Draw.click();                                                 
    Thread.sleep(2000);
  }

}

下面给出了我要点击的图片+按钮元素的HTML代码。

<div id="isc_C" eventproxy="isc_IconButton_Client_0" role="button" aria-label="XXXX" style="position: absolute; left: 80px; top: 0px; width: 42px; height: 42px; z-index: 200090; box-sizing: border-box; overflow: hidden; cursor: pointer;" onscroll="return isc_IconButton_Client_0.$lh()">
   <div id="isc_D" eventproxy="isc_IconButton_Client_0" style="position: relative; display: inline-block; box-sizing: border-box; width: 100%; vertical-align: top; visibility: inherit; z-index: 200090; cursor: pointer;">
     <table role="presentation" width="42" height="42" cellspacing="0" cellpadding="0">
       <tbody>
         <tr>
            <td class="iconButton" style="padding: 4px; background-color: transparent;" valign="top" nowrap="true" align="center">
              <img src="XXXX.png" style="vertical-align:middle;margin-bottom:5px;" eventpart="icon" suppress="TRUE" draggable="true" width="32" height="32" border="0" align="TEXTTOP">
                <br>
            </td>
          </tr>
      </tbody>
    </table>
 </div>
</div>

我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

首先,你下面的代码是错误的

   purchaseOnHoldSetRequest.AdditionalDetail[0] = new AdditionalDetail();
   purchaseOnHoldSetRequest.AdditionalDetail[0].Description = "1";

您需要将WebElement Draw = driver.findElement(ByScLocator.scLocator("//HLayout[ID=\"long_ribbon_HLayout\"]/member[Class=IconMenuButton||index=1||length=20||classIndex=0||classLength=4||roleIndex=0||roleLength=15||scRole=button]/icon")); 替换为ByScLocator.scLocatorxpath,如下所示

cssSelector

现在你写的xpath和你分享的HTML完全不同。

根据您的HTML,如果您想点击下面的元素

WebElement Draw = driver.findElement(By.xpath("//HLayout[ID=\"long_ribbon_HLayout\"]/member[Class=IconMenuButton||index=1||length=20||classIndex=0||classLength=4||roleIndex=0||roleLength=15||scRole=button]/icon"));

然后使用xpath作为

<td class="iconButton" style="padding: 4px; background-color: transparent;" valign="top" nowrap="true" align="center">

OR

//td[@class='iconButton']

现在,如果你的元素如下: -

//td[@class='iconButton' and @valign='top']

然后你可以使用: -

<img src="XXXX.png" style="vertical-align:middle;margin-bottom:5px;" eventpart="icon" suppress="TRUE" draggable="true" width="32" height="32" border="0" align="TEXTTOP">

希望它会对你有所帮助:)。