2014-03-13 61 views
0

团队,如何识别selenium webdriver中的隐藏文件元素

我试图自动化文件上传功能,但webdriver无法识别文件对象。这是事情:

  1. 该文件对象是在一个模式框(xpath是模式框是//* [@ id ='modalBoxBody']/div [1])。文件对象的类型和名称分别是文件和URL。
  2. 当我看到html内容时,有两个具有相同属性的对象。其中一个是可见的,另一个是不可见的。但是他们所属的层次是不同的。所以我使用的元素是可见的层次结构。

以下是我的代码。我已经尝试了所有可能的解决方案提供的stackoverflow(尽可能多的搜索),但没有任何工作。注释掉的部分意味着它们也被尝试并失败。

wbdv.findElement(By.xpath("//*[@id='left-container']/div[4]/ul/li/ul/li[2]/a")).click(); 
wbdv.switchTo().activeElement(); 

System.out.println(wbdv.findElement(By.xpath("//*[@id='modalBoxBody']/div[1]")).isDisplayed()); **//This returns true** 

List<WebElement> we = wbdv.findElement(By.xpath("//*[@id='modalBoxBody']/div[1]")).findElement(By.className("modalBoxBodyContent")).findElements(By.name("url")); **//There is only one element named url in this hierarchy** 
System.out.println(we.isEmpty()); //This returns false meaning it got the element named url 

//((JavascriptExecutor) wbdv).executeScript("document.getElementsByName('url')[0].style.display='block';"); **//This didn't work** 
for(WebElement ele: we){ 
String js = "arguments[0].style.height='auto'; arguments[0].style.visibility='visible';"; 
     ((JavascriptExecutor) wbdv).executeScript(js, ele); 

     System.out.println(ele.isDisplayed()); **//This returns FALSE** 
     System.out.println(ele.isEnabled()); **//This returns TRUE** 
     System.out.println(ele.isSelected()); **//This returns FALSE** 
     ele.click(); **//This throws org.openqa.selenium.ElementNotVisibleException exception** 

    } 

现在,如果你看看上面的3种方法,看起来该元素不显示,不选择但启用。所以当它不显示时,硒不能识别它。使其可见的Java脚本也无法挽救。

任何人都可以请帮我解决这个问题。它今天吃了我整整一天吗?

回答

0

在你最后的例子中,它看起来像你有正确的想法,使用'style.visibility'标签。我建议尝试的另一件事是使用“ExpectedConditions.visibilityOfElementLocatedBy”方法。通常我使用“presenceOfElementLocatedBy”,但是如果您正在讨论css visibility属性,我认为使用“visibilityOfElementLocatedBy”是要走的路。我认为你可能发生的情况是,你需要等待你想要获得的元素对象的等待条件,并且“ExpectedCondtions”方法应该给你你需要的东西。我看到你已经尝试了一些东西,但你还没有使用等待条件列出。没有保证,但你应该尝试一下:

WebDriverWait wait = new WebDriverWait(driver, 60); 
    wait.until(ExpectedConditions.visibilityOfElementLocated(
     By.xpath(".//whatever"))) 
+0

感谢您的回复。我实际上使用了隐式的等待方法。另外,我在显示模式框后尝试了20秒的睡眠方法。我认为20秒是足够时间显示元素的时间。然而,visibilityOfElementLocatedBy也失败了,因为它似乎永远不会变为可见。 – Prabhat

+0

我认为你可以改进JavaScript执行者的方式。此外,您可以尝试使用ByChained By定位器在两个步骤中获取元素。将测试分解成更多的较小测试步骤,您将更可能发现问题。 – djangofan

相关问题