【问题标题】:Selenium Twitter java硒推特 java
【发布时间】:2015-07-29 01:29:54
【问题描述】:

我正在尝试使用 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

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

谢谢

【问题讨论】:

    标签: java selenium twitter


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2021-09-06
      相关资源
      最近更新 更多