【问题标题】:Selenium Java-Unable to get text from the webpage elementSelenium Java - 无法从网页元素中获取文本
【发布时间】:2018-02-01 19:06:50
【问题描述】:

我正在自动化的网页:https://app.ghostinspector.com/account/create

场景:我正在单击注册页面并输入详细信息并单击注册按钮,现在如果用户传递相同的电子邮件地址,则消息“电子邮件地址已在使用中”。显示在网站上,所以我想做的是找到短信清除它并在运行时输入另一个电子邮件地址。

现在的问题是selenium的gettext方法没有获取到错误信息文本。

下面是代码:

 WebElement email_in_use = driver.findElement(
    By.xpath("/html/body/div[1]/div/div/div[2]/form/div/div[1]"));
    String message = email_in_use.getText();    
    System.out.println(message);

让我知道这里有什么问题。

【问题讨论】:

  • 尝试使用更好的 xpath 表达式,而不是自动化工具生成的 xpath 表达式。检查w3schools.com/xml/xpath_intro.asp
  • @AmrLotfy 感谢您的建议,但如果您没有错过发布日期,这个问题将被推迟一年 :) 当时是这方面的初学者。

标签: java selenium


【解决方案1】:

您只需稍等片刻,直到出现包含错误消息的DIV。下面的代码对我有用。

WebDriver driver = new FirefoxDriver();
driver.get("https://app.ghostinspector.com/account/create");
driver.findElement(By.id("input-firstName")).sendKeys("Johnny");
driver.findElement(By.id("input-lastName")).sendKeys("Smith");
driver.findElement(By.id("input-email")).sendKeys("abc@abc.com");
driver.findElement(By.id("input-password")).sendKeys("abc123");
driver.findElement(By.id("input-terms")).click();
driver.findElement(By.id("btn-create")).click();
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement e = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("div[ng-show='errors']")));
System.out.println(e.getText());

【讨论】:

    【解决方案2】:

    您正在使用 getAttribute("value") 从 div 元素中获取文本。尝试使用 email_in_use.getText()。

    【讨论】:

    • 是的,Sudharshan 曾尝试过 gettext() 方法,但最初它不起作用。
    • 它对我来说很好用。单击创建帐户按钮后尝试添加 Thread.sleep(2000) 并从 div 中获取文本。
    • @SudharsanSelvarj Thread.sleep 不是实现它的更好解决方案,您需要使用 WebDriverWait 实现 WebDriverWait...:)
    • 是的,我知道@SaurabhGaur。只是为了检查,我要求尝试使用 Thread.sleep。
    【解决方案3】:

    您需要在此处将WebDriverWait 实现为getText(),因为error 元素已经存在,没有任何文本,并且在发生任何错误时会填充文本,例如电子邮件地址已在使用中。

    所以你需要等到error 元素有一些文本,如下所示:-

    WebDriverWait wait = new WebDriverWait(driver, 100);
    
    String message = wait.until(new ExpectedCondition<String>() {
                        public String apply(WebDriver d) {
                            WebElement el = d.findElement(By.xpath("/html/body/div[1]/div/div/div[2]/form/div/div[1]"));
                            if(el.getText().length() != 0) {
                                return el.getText();
                            }
                        }
                    });
    
    System.out.println(message);
    

    注意 :- 由于您的xpath 是位置性的,这取决于元素位置,如果在操作过程中添加一些元素可能会失败,我建议您可以使用这个@ 987654327@还有By.xpath("//div[@ng-show='errors']")

    你也可以像下面这样使用:-

    wait.until(ExpectedConditions.textToBePresentInElementLocated(By.xpath("//div[@ng-show='errors']"), "E-mail address is already in use"));
    WebElement email_in_use = driver.findElement(By.xpath("//div[@ng-show='errors']"));
    String message = email_in_use.getText();
    

    希望它会起作用....:)

    【讨论】:

      【解决方案4】:

      试着用这个来清除文本框

      driver.switchTo().alert().getText(); 
      

      【讨论】:

      • 那不是问题。我无法收到“电子邮件地址已在使用中”的文本。来自 webelement email_in_use ....
      • 当然。
        电子邮件地址已被使用。
      • driver.switchTo().alert().getText();这将从您收到的警报中获取文本。
      【解决方案5】:

      你试过element.getAttribute('value')吗?

      src

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        • 2020-05-29
        • 2019-04-30
        • 2019-08-10
        • 2016-05-30
        相关资源
        最近更新 更多