xpath就像点击按钮一样,但没有真正的动作

时间:2015-10-30 19:44:40

标签: javascript java html selenium xpath

我目前正在为Web应用程序开发自动化测试套件。 Web应用程序非常挑剔。最近,我们进行了UI更新,因此我运行测试来测试我们的GUI和按钮,以及访问我们的xpath仍然有效。

在万圣节之前的夜晚,我的脚本真实 SPOOOOOOOKY

Ghosts probably in my script

在这些套件中,我有一组两个测试:yesLogout,noLogout。 yesLogout点击"是"当您尝试注销时按钮。 noLogout点击"否"尝试注销时按钮。

当你在测试脚本中运行noLogout时,脚本会点击" No"并且退出提示消失了。

在测试脚本中运行yesLogout时,脚本会单击"是"按钮,但没有任何反应。 "是"按钮生成一个动画,好像它被点击一样,但提示只是保留在那里。

手动点击按钮就可以了。

我要分享这两个方法(noLogout,yesLogout),因为它们实际上是相同的,它们只调用两个不同的xpath。为了这个问题,忘记我进行测试 - 测试现在不是问题。假装我是一个真正需要我的脚本点击此按钮的怪人。

用于测试的两个函数(极简化):

public class HiStackOverflow {

    public class yesLogout {
        public static void run(WebDriver driver) throws FileNotFoundException {
            Properties prop = new Properties();
            InputStream selectproductsidebar;

            selectproductsidebar = new FileInputStream(
                "C:/PATH/TO/PROPERTIES");
            try {
                prop.load(selectproductsidebar);
            } catch (IOException e) {
                e.printStackTrace();
            }


            WebElement yesLogout = driver.findElement(By.xpath(prop.getProperty("yeslogout")));
            Actions actions = new Actions(driver);
            actions.moveToElement(yesLogout).build().perform();
            yesLogout.click();
        }
    }

    public class noLogout {
        public static void run(WebDriver driver) throws FileNotFoundException {
            Properties prop = new Properties();
            InputStream selectproductsidebar;

            selectproductsidebar = new FileInputStream(
                "C:/PATH/TO/PROPERTIES");
            try {
                prop.load(selectproductsidebar);
            } catch (IOException e) {
                e.printStackTrace();
            }


            WebElement noLogout = driver.findElement(By.xpath(prop.getProperty("nologout")));
            Actions actions = new Actions(driver);
            actions.moveToElement(noLogout).build().perform();
            noLogout.click();
        }

    }
}

“是”按钮的xpath和属性文件中的“否”按钮:

yeslogout = //div[contains(@title,'Enter')]
nologout = //div[contains(@title,'Esc')]

以下是与此问题相关的HTML:

<div style="transform: translate(0px, 60px) scale(1, 1) rotate(0deg);">
  <div style="transform: translate(10px, 0px) scale(1, 1) rotate(0deg);">
    <div>
      <div tabindex="6" role="button" aria-label="Yes" title="Keyboard shortcut: Enter">
        <div>
        </div>
        <div tabindex="7" role="button" aria-label="No" title="Keyboard shortcut: Esc" style="transform: translate(163.5px, 0px) scale(1, 1) rotate(0deg);">
          <div>
          </div>
        </div>
      </div>
    </div>

tabindex="6"是是按钮。 tabindex="7"是没有按钮。两者之间存在细微的差别(没有按钮有某种变换:翻译附魔法),但据我所知,它不应该表现得那么奇怪。

再一次,实际问题 - 运行yesLogout方法定位,悬停并单击Yes按钮,但没有任何反应。手动单击“是”按钮可以正常工作。

如果需要,我可以在html中扩展一些<div>,但我真的不认为它会显示太多(只是更多的格式和<canvas>内容)。我真的对解释正在发生的事情感兴趣。提前谢谢。

修改: 我试图使用JavascriptExecutor来点击元素,但唉,它没有用。这整个周末一直在绞尽脑汁。

甚至做了一些疯狂的事情:

WebElement yesLogout = driver.findElement(By.xpath(prop.getProperty("yeslogout")));
        Actions actions = new Actions(driver);
        actions.moveToElement(yesLogout, 10, 10).build().perform();
        yesLogout.click();
        yesLogout.click();
        yesLogout.click();
        yesLogout.click();
        yesLogout.click();
        yesLogout.click();

显示一遍又一遍地点击按钮,但没有实际功能。

为了完整性并试图让人们理解这个问题,我会重申,手动点击该按钮非常有效。和Enter快捷方式一样。 Selenium .click()命令 VISIBLY &#34; work&#34;,但不执行按钮本身的功能。

第二次编辑: 我将包含一个完全扩展的有关div的HTML:

<div style="transform: translate(794px, 202px) scale(1, 1) rotate(0deg);" tabindex="5" role="dialog">
  <div>
    <div>
      <div>
        <div>
          <div>
            <canvas height="106" width="332" style="top: 0px; left: 0px; width: 332px; height: 106px;" />
          </div>
        </div>
        <div style="transform: translate(10px, 10px) scale(1, 1) rotate(0deg);">
          <div>
            <div style="transform: translate(6px, 6px) scale(1, 1) rotate(0deg);">
              <div style="font-family: franklin-gothic-urw; font-weight: 400; font-style: normal; font-size: 14px; opacity: 1; color: rgb(0, 0, 0);">Are you sure you want to logoff?</div>
            </div>
          </div>
        </div>
        <div style="transform: translate(0px, 60px) scale(1, 1) rotate(0deg);">
          <div style="transform: translate(10px, 0px) scale(1, 1) rotate(0deg);">
            <div>
              <div tabindex="6" role="button" aria-label="Yes" title="Keyboard shortcut: Enter">
                <div>
                  <div>
                    <div>
                      <div>
                        <div>
                          <canvas height="36" width="148" style="top: 0px; left: 0px; width: 148.5px; height: 36px;" />
                        </div>
                      </div>
                      <div style="transform: translate(56px, 7px) scale(1, 1) rotate(0deg);">
                        <div style="font-family: proxima-nova; font-weight: 400; font-style: normal; font-size: 17px; opacity: 1; color: rgb(255, 255, 255); transform: translate(5px, 0px) scale(1, 1) rotate(0deg);">Yes</div>
                      </div>
                      <div style="">
                        <div>
                          <div>
                            <canvas height="36" width="148" style="top: 0px; left: 0px; width: 148.5px; height: 36px;" />
                          </div>
                        </div>
                        <div style="display: none;">
                          <div>
                            <canvas height="36" width="148" style="top: 0px; left: 0px; width: 148.5px; height: 36px;" />
                          </div>
                          <div style="transform: translate(56px, 7px) scale(1, 1) rotate(0deg);">
                            <div style="font-family: proxima-nova; font-weight: 400; font-style: normal; font-size: 17px; opacity: 1; color: rgb(255, 255, 255); transform: translate(5px, 0px) scale(1, 1) rotate(0deg);">Yes</div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
              <div tabindex="7" role="button" aria-label="No" title="Keyboard shortcut: Esc" style="transform: translate(163.5px, 0px) scale(1, 1) rotate(0deg);">
                <div>
                  <div>
                    <div>
                      <div>
                        <div>
                          <canvas height="36" width="148" style="top: 0px; left: 0px; width: 148.5px; height: 36px;" />
                        </div>
                      </div>
                      <div style="transform: translate(58px, 7px) scale(1, 1) rotate(0deg);">
                        <div style="font-family: proxima-nova; font-weight: 400; font-style: normal; font-size: 17px; opacity: 1; color: rgb(255, 255, 255); transform: translate(5px, 0px) scale(1, 1) rotate(0deg);">No</div>
                      </div>
                      <div style="display: none;">
                        <div>
                          <div>
                            <canvas height="36" width="148" style="top: 0px; left: 0px; width: 148.5px; height: 36px;" />
                          </div>
                        </div>
                        <div style="display: none;">
                          <div>
                            <canvas height="36" width="148" style="top: 0px; left: 0px; width: 148.5px; height: 36px;" />
                          </div>
                          <div style="transform: translate(58px, 7px) scale(1, 1) rotate(0deg);">
                            <div style="font-family: proxima-nova; font-weight: 400; font-style: normal; font-size: 17px; opacity: 1; color: rgb(255, 255, 255); transform: translate(5px, 0px) scale(1, 1) rotate(0deg);">No</div>
                          </div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

3 个答案:

答案 0 :(得分:2)

首先尝试使用不同的选项进行调试,例如传递键盘Enter键以查看它是否有效

WebElement.sendKeys(Keys.ENTER);

您可以尝试的其他选项是使用CSS查找元素或Java脚本方法以单击元素

WebElement element = driver.findElement(By.id("gbqfd"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);

参考:How to click an element in Selenium WebDriver using JavaScript

答案 1 :(得分:1)

我不知道这取决于你与否,但我会尝试为这些按钮添加id或更独特的属性(因为它们对应用程序非常重要)。

另一方面,你一定需要actions.moveToElement()这件事吗?你不能只点击元素吗?这可以减少任何意外行为:

WebElement yesLogout = driver.findElement(By.xpath("..."));
yesLogout.click();

最后一件事(为了更好地理解),我不确定我理解为什么你会使用div作为按钮?为什么按钮位于( div 按钮内?这可能会导致问题。

答案 2 :(得分:1)

有一些事情可能导致这种情况,但如果没有将相关的JavaScript添加到您的问题中,我无法确定。我假设在页面上的JavaScript中的某个地方,有一个函数绑定到实际执行您期望的操作的click事件。

可能是此事件绑定到yes按钮的子节点。在这种情况下,单击页面上的按钮可能会在浏览器中触发单击事件。但是,因为您的xpath是以父路径为目标,所以selenium只会触发针对该元素的click事件,因此不会触发其子项上的任何事件。但是,如果动画附加到父动画,则可能仍会触发动画。这可以通过使xpath目标指向附加了click事件的特定元素来解决。

不幸的是,如果JavaScript乱七八糟,找到附加事件的元素可能会很麻烦。可能对您有所帮助的一点是,如果您在Chrome开发人员工具中检查元素,则会有一个事件侦听器选项卡。您可以看到哪些元素具有绑定到它们的单击事件,但如果它们使用jQuery,则不显示特定方法,而是使用jQuery方法之一。