SeleniumTwitterJava

SeleniumTwitterJava,java,selenium,twitter,Java,Selenium,Twitter,我正在尝试使用SeleniumWebDriver连接到我的twitter帐户 WebDriver driver = new FirefoxDriver(); driver.get("https://www.twitter.com/login/"); WebElement formElement = driver.findElement(By.cssSelector("form.signin")); List<WebElement> allFormChildElements = fo

我正在尝试使用SeleniumWebDriver连接到我的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;
        }      
    }
WebDriver=newfirefoxdriver();
驱动程序。获取(“https://www.twitter.com/login/");
WebElement formElement=driver.findElement(By.cssSelector(“form.signin”);
列出所有FormChildElements=formElement.findElements(按.cssSelector(“输入”));
for(WebElement项:allFormChildElements)
{       
System.out.println(“+item.getAttribute(“名称”));
开关(item.getAttribute(“名称”)){
案例“会话[用户名或电子邮件]”:
item.sendKeys(用户名);
打破
案例“会话[密码]”:
项。发送密钥(密码);
打破
}      
}
但是我得到了这个错误日志:

<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
会话[用户名或电子邮件]
线程“main”org.openqa.selenium.ElementNotVisibleException中的异常:元素当前不可见,因此可能无法与之交互
命令持续时间或超时:38毫秒
ds

我不明白,因为它正在打印输入的名称,为什么不可见? 有什么想法吗


感谢

通过检查twitter登录页面的DOM,发现有两个表单具有几乎相同的属性,并找到三个用户名和密码字段。这就是为什么您会得到
ElementNotVisibleException
[参见图片]

因此,您必须使用相对xpath或css选择器,或者为此实现一个逻辑

我不知道为什么要遍历所有输入字段,然后通过检查其属性来查找元素。只需调用
driver.findelelements(by.name())

相对Xpath

当我发现
@class
签名包装器中的输入是可见的时,我选择了这个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;
}
driver.get(“https://twitter.com/login/");
getVisibleElement(驱动程序,“会话[用户名或电子邮件]”)。sendKeys(“viavisibleName”);
getVisibleElement(驱动程序,“会话[密码]”).sendKeys(“viavisibleName”);
公共静态WebElement getVisibleElement(WebDriver驱动程序,字符串名称){
列表元素=driver.findElements(By.name(name));
for(WebElement:elements){
if(element.isDisplayed()){
返回元素;
}
}
返回null;
}