我正在尝试使用 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
我不明白,因为它正在打印输入的名称,为什么不可见?
有任何想法吗 ?
Thanks
发现通过检查 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)