我目前正在为Web应用程序开发自动化测试套件。 Web应用程序非常挑剔。最近,我们进行了UI更新,因此我运行测试来测试我们的GUI和按钮,以及访问我们的xpath仍然有效。
在万圣节之前的夜晚,我的脚本真实 SPOOOOOOOKY 〜
在这些套件中,我有一组两个测试: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>
答案 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方法之一。