我正在创建一个涉及搜索记录然后更新记录的脚本。在搜索屏幕上,用户可以选择查看高级搜索选项。切换显示或隐藏高级搜索由一个按钮控制。
<a title="Searches" href="javascript:expandFilters()"><img border="0" align="absmiddle" alt="Advanced" src="****MASKED URL****"></a>
搜索按钮在显示或隐藏高级搜索时的属性之间的唯一区别是img src:
隐藏高级搜索时,IMG src以“/Styles/\u Images/advanced\u button.jpg”结尾,当高级搜索可见时,IMG src以“/Styles/\u Images/basic\u button.png”结尾
当我打开页面时,有时会显示高级搜索选项,有时不会。我要搜索的值出现在高级部分,因此为了让我的脚本工作,我添加了一个IF语句。
<input type="text" value="" maxlength="30" size="30" name="guiSystemID">
IF语句查找我需要输入数据的字段,如果该字段不存在,则表明高级选项不可见,我需要单击按钮展开搜索选项。
我创建了以下IF语句。
if (!driver.findElement(By.name("guiSystemID")).isDisplayed()) {
driver.findElement(By.cssSelector("img[alt='Advanced']")).click();
}
当我运行脚本并展开高级搜索时,脚本将成功运行。但是,当我运行脚本并且高级搜索未展开时,脚本失败,并通知我它找不到对象“guiSystemID”。这是令人沮丧的,因为如果它找不到它,那么我希望脚本继续,进入if语句的真正路径。
是否有人对我如何评估字段是否出现而不会因为找不到字段而导致脚本失败有任何建议。
提前谢谢
西蒙
使用try Catch违背了isshow()用作if条件的真正目的,人们可以在不使用“if”的情况下编写下面的代码
try{
driver.findElement(By.xpath(noRecordId)).isDisplayed();
//Put then statements here
}
Catch(Exception e)
{//put else statement here.}
我的结果好坏参半。isDisplayed()在过去。由于有各种方法可以隐藏DOM上的元素,我认为这归结为isDisplayed()的灵活性问题。我倾向于提出自己的解决方案。我将分享我所做的几件事,然后为您的场景提出建议。
除非我有非常具体的东西,否则我倾向于使用包装器方法来执行许多可见性检查。这是概念,我将把实际的实现方法留给您。对于这里的一般示例,只需假设“定位器”是您选择的位置方法(CSS、XPath、Name、ID等)。
第一个也是最简单的检查是查看元素是否存在于DOM上。如果它不存在,它肯定是不可见的。
boolean isPresent = driver.findElements(locator).size() > 0;
然后,如果返回true,我将检查元素的维度:
Dimension d = driver.findElement(locator).getSize();
boolean isVisible = (d.getHeight() > 0 && d.getWidth() > 0);
现在,如果元素的高度和宽度确实大于零,维度有时会返回误报,但例如,另一个元素覆盖了目标元素,使其在页面上看起来隐藏(至少,我在过去遇到过几次)。因此,作为最后的检查(如果维度检查返回true),我查看元素的样式属性(如果已定义)并相应地设置布尔值:
String elementStyle = driver.findElement(locator).getAttribute("style");
boolean isVisible = !(elementStyle.equals("display: none;") || elementStyle.equals("visibility: hidden;"));
这些适用于我遇到的大多数元素可见性场景,但有时前端开发人员会做一些不同的事情,需要自己处理。
一个简单的场景是,有一个定义元素可见性的CSS类。它可以被命名为任何东西,所以让我们假设“隐藏”是我们需要寻找的东西。在这种情况下,对“class”属性的简单检查应该会产生合适的结果(如果上述任何方法都无法做到这一点):
boolean isHidden = driver.findElement(locator).getAttribute("class").contains("hidden");
现在,针对您的特殊情况,根据您上面提供的信息,我建议根据“src”属性的评估设置一个布尔值。这将是与上面的CSS类检查类似的方法,但使用在稍微不同的上下文中,因为我们确切地知道两种状态之间的属性变化。请注意,只有当元素有两种状态(如您所述的Advanced和Basic)时,这才会以这种方式工作。如果有更多状态,我会考虑设置一个枚举值或类似的东西。因此,假设元素代表Advanced或Basic:
boolean isAdvanced = driver.findElement(locator).getAttribute("src").contains("advanced_button.jpg");
从这些方法中的任何一种,一旦获得布尔值,就可以相应地开始if/then逻辑。
我为我的冗长道歉,但希望它能帮助你走上正确的道路。
我可能回答得晚了,但这可能会帮助其他人寻找同样的答案。
我最近在使用isDisplay()时遇到了类似的问题。我的代码是这样的
if(driver.findElement(By.xpath(noRecordId)).isDisplayed() )
{
/**Do this*/
}
else
{
/**Do this*/
}
当isDisplay试图查找的元素存在时,这段代码运行得很好。但是当元素不存在时,它会继续寻找它,因此会抛出一个异常“NosuchElementFind”。所以我无法测试其他部分。
我想出了一种处理这个问题的方法(用try-and-catch块包围{if,else}),比如这样。
public void deleteSubVar() throws Exception
{
try
{
if(driver.findElement(By.xpath(noRecordId)).isDisplayed() )
{
/**when the element is found do this*/
}
}
catch(Exception e)
{
/**include the else part here*/
}
}
希望这有助于:)
问题内容: 我正在创建一个脚本,其中涉及搜索记录,然后更新记录。在搜索屏幕上,用户可以选择查看高级搜索选项。切换显示或隐藏高级搜索是由一个按钮控制的。 显示或隐藏高级搜索时,搜索按钮的属性之间唯一的区别是img src: 隐藏高级搜索后,IMG src以“ /Styles/_Images/advanced_button.jpg”结尾;当可见高级搜索时,IMG src以“ /Styles/_Imag
问题内容: 这个问题已经在这里有了答案 : 从列表中删除项目并对其进行迭代时出现奇怪的结果 (4个答案) 5年前关闭。 对于我的一生,我无法弄清楚为什么我的IF语句没有受到攻击。在很多情况下,n的余数//放在结果列表中的最后一个数字为0。 问题答案: 问题是您要在迭代列表时修改列表,因此所有偶数都将被跳过。因此,条件总是。 该循环跟踪指数的,所以当你在索引中删除的项目在,下一个项目个位置转变为当前
行动时刻 - 在unlang中使用if语句 if语句本身并不复杂。 它具有以下格式: if(condition){ ... } 由于其许多可能性,条件部分可能变得复杂。 使用if语句获取返回码 我们现在将查看模块的返回代码,并使用此代码与指定的条件进行比较。 FreeRADIUS中的每个模块都需要在调用时返回代码。 随后可以将此代码的值用作if语句中的条件检查。 使用if语句授权用户 如
问题内容: 我是一个新手,Python和目前正在学习像控制流的命令,等 该语句工作正常,但是当我编写或命令时,解释器给我一个语法错误。我使用的是Python 3.2.1,问题出在其本机解释器和IDLE中。 我遵循的是 《 Python的字节》一 书中给出的内容。如您所见,并且给出了 Invalid Syntax 。 为什么会这样呢?我在IDLE和交互式python中都遇到了问题。我希望语法正确。
问题内容: 我是Java的新手,正在尝试学习速记语句的概念。 我想出了下面的代码。但是,该代码将无法编译,并在(即?:)语句旁边显示错误。 有人可以告诉我为什么它不起作用吗? 对不起,如果我的问题对某些人听起来很愚蠢。我是Java新手。 在此先感谢您的帮助! 问题答案: 三元表达 是一个 表达式 ,而不是一个语句,因此不能在需要语句的地方使用。 您可以这样写: 因为这是一个声明。
问题内容: 在C语言中,我可以编写一个if语句 但是,当我尝试在Java中执行相同操作时,编译器会告诉我“不兼容的类型”,并说我需要一个而不是一个。有什么方法可以用Java编写C代码吗? 问题答案: 以下任何一项都可以为您工作: