问题描述
我正在尝试使用Selenium Webdriver连接到我的Twitter帐户
WebDriver driver = new FirefoxDriver();
driver.get("https://www.twitter.com/login/");
WebElement formElement = driver.findElement(By.cssSelector("form.signin"));
List<WebElement> allFormChildElements = formElement.findElements(By.cssSelector("input"));
for(WebElement item : allFormChildElements )
{
System.out.println("<"+item.getTagName()+"> "+ item.getAttribute("name") );
switch(item.getAttribute("name")) {
case "session[username_or_email]":
item.sendKeys(username);
break;
case "session[password]":
item.sendKeys(password);
break;
}
}
但我收到此错误日志:
<input> session[username_or_email]
Exception in thread "main" org.openqa.selenium.ElementNotVisibleException: Element is not currently visible and so may not be interacted with
Command duration or timeout: 38 millisecon
DS
我不明白,因为它是打印输入的名称,为什么不可见? 有任何想法吗 ?
谢谢
1楼
发现通过检查twitter登录页面的DOM有两种形式具有几乎相同的属性,并且找到了三个用户名和密码字段。这就是为什么你得到ElementNotVisibleException
[见图片]
因此,你必须使用相对的xpath或css选择器或为此实现逻辑。我正在证明你可以通过两种方式处理这种情况
而且我不知道你为什么迭代所有的输入字段然后通过检查它的属性来找到元素。你可以简单地调用driver.findElements(By.name())
相对Xpath
当我发现@class
signin-wrapper
中的输入是可见的时,我已经去了这个xpath
driver.get("https://twitter.com/login/");
driver.findElement(By.xpath("//div[@class='signin-wrapper']//input[@name='session[username_or_email]']")).sendKeys("viaxpath");
driver.findElement(By.xpath("//div[@class='signin-wrapper']//input[@name='session[password]']")).sendKeys("viaxpath");
获取可见元素
顾名思义,它将找到所有元素并返回仅可见的元素
driver.get("https://twitter.com/login/");
getVisibleElement(driver, "session[username_or_email]").sendKeys("viavisibleName");
getVisibleElement(driver, "session[password]").sendKeys("viavisibleName");
public static WebElement getVisibleElement(WebDriver driver, String name) {
List<WebElement> elements = driver.findElements(By.name(name));
for (WebElement element : elements) {
if (element.isDisplayed()) {
return element;
}
}
return null;
}