我正在为移动网站进行自动化测试,但是选择(包含国家/地区列表)存在问题。
菜单就是这样:
<select id="depart" name="fromIsoCode" aria-controls="depart" aria-expanded="false">
<option value="xx">yyFullName</option>
<option value="yy">yyFullName</option>
</select>
重要说明::单击菜单并且用户列表为“可见”时,属性“ aria-expanded” 变为“ true “
我应该做的测试是检查一旦选择一个值,该列表将不再可见/显示。
我在下面的代码中使用了一些东西进行测试:
By element = By.cssSelector("select#depart[aria-expanded=\"true\"]")
assertFalse(driver.findElement(element).isDisplayed());
问题在于,即使到达这些行时元素不存在,isDisplayed()
也会返回true
在调试模式下,元素select#depart[aria-expanded=\"true\"]
不在页面的DOM中(但select#depart[aria-expanded=\"false\"]
在页面的DOM中)
isDisplayed()
的结果与我的预期相反:
对于select#depart[aria-expanded=\"true\"]
,它应该是错误的(我在DOM中没有该元素,但确实如此,对于select#depart[aria-expanded=\"false\"]
,它应该是正确的(它在DOM中),但它是错误的。 ..
我的第一个猜测是,这与我们之前选择的东西有关,但是事实证明,不,即使检查是我在页面上所做的第一件事,它仍会失败。
第二个猜测是选择元素是特定的,和/或试图将select#depart[aria-expanded=\"true\"]
和select#depart[aria-expanded=\"false\"]
用作不同元素的问题,但是我不知道如何处理
问题是:
编辑1 18/3/09
我试图测试“ aria-expanded”值,它给出相同的结果。 在DOM中应该是假的时候,我会认为它是假的,但是在调试时,硒会变成“ true”。
编辑2 18/3/09
调试中,我注意到以下几点:如果在“观察”变量之前“检查”我的浏览器,则调试中得到的结果就可以了...
调试暂停->我在“ aria-expanded”上添加了一个手表,它给出了“ true”(而不是预期的“ false”)->我右键单击浏览器/检查“ aria-expanded”页面是否“ false”->我添加第二个具有相同元素的手表,或者“刷新”第一个手表,我在“ aria-expanded”(“ false”)中得到了正确的值... 等待时间的增加无济于事...尝试更多的项目符号,我会返回更多信息
修改3 18/3/18
问题不在于下拉菜单的状态。我和theGuy都完成了“检查下拉菜单是否已展开”工作(问题1)
由于这是我接受盖伊回答的主要问题。
关于问题2:这可能是一个特定的问题,值得提出自己的问题,我设法通过在选择中发送“制表键”来暂时解决该问题。这是一个“紧急情况下”的修复程序,但是我不想让整个问题都待解决,也不想让人们至少没有领先优势。
答案 0 :(得分:1)
尝试:
By element = By.cssSelector("select#depart[aria-expanded='true']")
assertFalse(driver.findElement(element).isDisplayed());
这是您可以尝试的另一种解决方案:
// wait here after you have selected a value so element state is changed and selenium gets updated state. Thread.sleep(); would seem to work best in this case.
String text= driver.findElement(By.id("depart")).getAttribute("aria-expanded");
Assert.assertTrue(text=="false","Dropdown is not expanded");