当前位置: 首页 > 知识库问答 >
问题:

当使用Java测试登录时,Selenium中的NoTouchElementException

萧嘉茂
2023-03-14

我正在编写John Sonmez的Selenium测试框架教程,在尝试执行第一个测试时遇到了问题。试验部分包括两种方法:1<代码>登录页面。GoTo() 打开wordpress登录页面和2<代码>登录页面。LoginAs(“管理员”)。登录() 插入用户名并单击“继续”。当我运行测试时,wordpress登录页面打开,2秒钟后,空白的Chrome浏览器打开,JUnit显示NoTouchElementException。教程的作者通过添加一些WebDriverWait切换到解决了这个问题。ActiveElement。getAttribute()登录页面。GoTo() 方法。然而,他用C#编写代码,没有为我正在编写的Java提供任何解决方案。我也尝试过应用WebDriverWait,但问题仍然存在。有谁能建议我如何使用Java中的WebDriverWait解决这个问题吗。

登录测试

import static org.junit.Assert.*;    
import org.junit.Assert;
import org.junit.Test;        
import wordpressAutomation.Driver;
import wordpressAutomation.LoginPage;

public class LoginTest extends Driver {

        @Test
        public void admin_user_can_login() {
            LoginPage l = new LoginPage();
            l.GoTo();
            LoginPage.LoginAs("scenicrail").Login();
            //Assert.assertTrue(DashboardPage.IsAt, "Failed to login");
        }

}

登录页面

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class LoginPage extends Driver {

    @Test
    public void GoTo() {
        openBrowser().get("https://wordpress.com/log-in");
    }

    public static LoginCommand LoginAs(String username) {

        return new LoginCommand(username);
    }

}

public class LoginCommand extends Driver  {

    private String username;
    private String password; 

    public LoginCommand(String username) {

        this.username = username;

    }

    public LoginCommand WithPassword(String password) {

        this.password = password;
        return this;

    }


    public void Login() {

        WebElement login =  openBrowser().findElement(By.xpath("//*[@id='usernameOrEmail']"));
        login.sendKeys(username);
        openBrowser().findElement(By.xpath("//button[@type = 'submit']")).click();

    }   


}

public class Driver {

   public WebDriver openBrowser() {

      System.setProperty("webdriver.chrome.driver", "C:\\Users\\KatarinaOleg\\Desktop\\chromedriver_win32\\chromedriver.exe");
      WebDriver driver = new ChromeDriver();
      driver.manage().window().maximize();
      //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      return driver;
   }    

}

共有2个答案

乌翔
2023-03-14

您在登录方法中多次从登录命令类调用Open浏览器。因此,它将不必要地创建不同的驱动程序实例。因此,您的代码需要修改如下,以及显式等待(驱动程序类也需要修改如下)

LoginCommand类的登录方法:

   public void Login() {

        WebDriverWait wait=new WebDriverWait(driver,20);
        wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='usernameOrEmail']")));
        WebElement login = driver.findElement(By.xpath("//*[@id='usernameOrEmail']"));

        login.sendKeys(username);
        driver.findElement(By.xpath("//button[@type = 'submit']")).click();
    }

驱动类:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Driver {

    WebDriver driver;

    public WebDriver openBrowser() {
        System.setProperty("webdriver.chrome.driver", "drivers/chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        return driver;
    }
}

编辑:(LoginTest类中的dmin_user_can_login()方法)

@Test
public void admin_user_can_login() {
    LoginPage l = new LoginPage();
    l.GoTo();

    l.LoginAs("scenicrail").Login();
    //Assert.assertTrue(DashboardPage.IsAt, "Failed to login");
}

登录页面类别:

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class LoginPage extends Driver {

    @Test
    public void GoTo() {
        openBrowser().get("https://wordpress.com/log-in");
    }

    public LoginCommand LoginAs(String username) {

        return new LoginCommand(username);
    }

}
赫连实
2023-03-14

打开页面后,你可以在其中添加NoTouchElementException这样的内容。

FluentWait<WebDriver> webDriverWait = new WebDriverWait(driver, 25).pollingEvery(5, TimeUnit.SECONDS);
webDriverWait.until(ExpectedConditions.visibilityOf(webElement));

只要添加在任何元素您想使用作为您的检查以确保页面已加载

 类似资料:
  • 在本节中,将学习如何在Selenium IDE中创建登录测试用例。 出于测试目的,我们将测试考评师网 的登录页面,该网站网址如下: http://www.kaops.com/ 注意:可以在任何公开可用的网站上注册并创建登录测试。 下图显示了当点击上述URL时显示的主页的快照。 首先,注册用户以获取登录凭据。 对于此测试,我们已经生成了登录凭据(账户和密码)。 现在,生成一个测试脚本,以在Selen

  • 我想用selenium登录这个网页。我尝试了selenium的find_element_by_,并使用浏览器中的检查元素。但是我无法登录。我在搜索id、名称、类名,这样我就可以用send_keys传递数据,但是没有做到这些。有人能帮助我提供一些代码来将数据推送到所需的字段吗?谢谢。这就是我到目前为止所做的。 在此之后,我试图点击按钮登录使用 但它失败了。它给出了无法找到“登录”的错误。由于默认情况

  • 问题内容: 我知道这不是一个适当的技术问题,但是在使用selenium制作Facebook发布机器人时,我遇到了问题。到目前为止,这是我的代码 现在,问题是我的代码无法在Fb页面中找到状态框,我对selenium还是很陌生。任何帮助都很好,它是用python编码的。 问题答案: 这是访问的示例代码块 ,通过一组有效的凭据登录,并在以及中使用键入 “ Hie” : 使用XPATH: 使用CSS_SE

  • 问题内容: 我收到一个元素不可见的错误: 对于运行此代码时的每个find元素行: 页面登录部分的HTML如下所示: 问题答案: Selenium与用户与Web浏览器的交互方式类似。因此,如果您尝试与之交互的html元素不可见,那么最简单的解释是,当您编写硒代码时,您不会像普通用户那样与网页进行交互。 最后,这与网页的html无关,与DOM和元素的hidden属性无关。我建议您下载Firebug或其

  • 我目前正在学习使用Java的selenium automation,并尝试在MacOS上执行facebook自动登录操作系统Safari 14.0.2 我已经写了这段代码——这段代码在Google Chrome上运行,我已成功登录。 脚本: 一切都按预期进行,直到最后一步-单击登录按钮。我在控制台中得到这个错误: 你能告诉我解决方法吗?或者我在哪里能找到问题?非常感谢。

  • 我想写个脚本登录https://us.etrade.com/e/t/user/login 我正在使用Selenium,但它会在启动时检测到Selenium,并生成一条消息,表示服务器拥挤,发生这种情况时,我无法登录。我也尝试过使用未检测到的硒和硒隐形,但都被检测到了。我真的需要自动化这个登录过程。我尝试过使用python请求,但这不起作用。我对任何其他技术或方法持开放态度,允许我实现自动化。请帮忙