1

我正在使用 Selenide 编写浏览器测试。在这个测试中,我必须切换到不同的 iframe 几次。当我用 Chrome 运行这个测试时,它运行良好。但是当我使用 phantomjs 时,有时它可以工作,有时它会失败。我看不出它失败的原因。

这是我收到的错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
   at java.util.ArrayList.elementData(Unknown Source)
   at java.util.ArrayList.get(Unknown Source)
   at com.codeborne.selenide.impl.CollectionElement.getWebElement(CollectionElement.java:29)
   at com.codeborne.selenide.impl.SelenideElementProxy.dispatchAndRetry(SelenideElementProxy.java:82)
   at com.codeborne.selenide.impl.SelenideElementProxy.invoke(SelenideElementProxy.java:56)
   at com.sun.proxy.$Proxy1.getAttribute(Unknown Source)
   at automationFramework.PegaRulesetCheck.main(PegaRulesetCheck.java:8)

java 代码很长,所以我只会展示它失败的部分。

79. /*Get the list of iframes*/
80. List<SelenideElement> myIframes = $$("iframe");
81. System.out.println("Switching to iframe " + myIframes.get(myIframes.size() - 1).getAttribute("name"));

所以出于某种原因,有时它会失败,有时它会起作用。很随意。我怀疑第 80 行创建 iframe 列表并不总是有效。可能是在动态创建其他 iframe 之前创建了列表,因此无法切换到其他 iframe。但我不知道如何解决这个问题。

4

1 回答 1

0

好的,所以我能够解决这个问题。我的怀疑是正确的,有时列表是在动态加载所有 iframe 之前创建的。

所以我能够通过使用检查数组是否包含 iframe 的 for 循环来解决这个问题。如果它不包含 iframe,它将等待 100 毫秒。

/*Get the list of iframes*/
List<SelenideElement> myIframes = $$("iframe");

/* For loop that makes sure that the list of iframes is bigger than 0 */
for (int i=1; myIframes.size() < 1; i++){
    Thread.sleep(100);
    myIframes = $$("iframe");
    /* if the script waits for 10 seconds, break out of the for loop. */
    if(i > 99){
        System.out.println("Breaking out of for loop, list of iFrames contains : " + myIframes.size() + " frame.");
        break;
    }
}
于 2016-01-26T16:37:36.620 回答