Selenium Webdriver - 点击隐藏元素

24

我正在尝试自动化在Google Drive中的上传文件功能。

用于传递参数的元素被隐藏,并且高度为0像素。

用户的任何操作都不会使此元素可见。因此,我需要一种解决方法来在元素不可见时点击它。

<input type="file" style="height: 0px; visibility: hidden; position: absolute; width: 340px; font-size: inherit;" multiple=""/>

上述元素的xpath为-
//*[@class='goog-menu goog-menu-vertical uploadmenu density-tiny']/input

我正在使用
WebDriver.findElement(By.xpath(<xpath>).sendKeys(<uploadFile>)

异常 -

org.openqa.selenium.ElementNotVisibleException

元素当前不可见,因此可能无法进行交互。
我尝试使用JavascriptExecutor,但无法找到准确的语法。

看一下HTML,Google Drive只是一个表单吗?如果是这样的话,不要使用Selenium,只需编写一个脚本来提交您指定的数据。 - jasop
5个回答

23

试一下这个:

WebElement elem = yourWebDriverInstance.findElement(By.xpath("//*[@class='goog-menu goog-menu-vertical uploadmenu density-tiny']/input"));
String js = "arguments[0].style.height='auto'; arguments[0].style.visibility='visible';";

((JavascriptExecutor) yourWebDriverInstance).executeScript(js, elem);

上述代码会改变你的文件输入控件的可见性。然后,您可以按照文件上传的常规步骤继续操作,例如:

elem.sendKeys("<LOCAL FILE PATH>"); 

要注意,通过改变输入字段的可见性,您正在干涉测试应用程序。注入脚本以更改行为是有侵入性的,不建议在测试中这样做。


这是否也适用于Appium Android平台上的隐藏元素? - Ashok kumar Ganesan

14

简单解决方案:

WebElement tmpElement = driver.finElement(ElementLocator);
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", tmpElement);

2

尝试这个示例代码:

JavascriptExecutor executor= (JavascriptExecutor)driver;
executor.executeScript("document.getElementById('ID').style.display='block';");
Select select = new Select(driver.findElement(By.id("ID")));
select.selectByVisibleText("value");
Thread.sleep(6000);

通过使用JavaScript执行器并使元素可见,然后通过ID单击该元素。希望这可以帮助您解决问题。

为什么需要线程休眠?executeScript应该是同步的。 - riccardo.tasso

1

试试这个:

WebElement elem = yourWebDriverInstance.findElement(
   By.cssSelector(".uploadmenu > input"));
String js = 
  "arguments[0].style.height='auto'; arguments[0].style.visibility='visible';";
((JavascriptExecutor) yourWebDriverInstance).executeScript(js, elem);

我已经用CSS选择器替换了XPath。请告诉我上面的脚本是否有效。


1
你可以试一下以下的方法:
((JavascriptExecutor)driver).executeScript("$('.goog-menu.uploadmenu > input').click();");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接