首页 > 解决方案 > 如何使用 Selenium java 从字段中获取值

问题描述

我尝试从页面https://temp-mail.org/获取价值(电子邮件地址) ,并将其放入字符串中。

所以我的代码是这样的:

maven依赖:

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>3.141.59</version>
    </dependency>

    <dependency>
        <groupId>io.github.bonigarcia</groupId>
        <artifactId>webdrivermanager</artifactId>
        <version>4.3.1</version>
    </dependency>

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.8.8</version>
        <scope>test</scope>
    </dependency>
</dependencies>

我创建摘要页面

public abstract class AbstractPage {
    protected WebDriver driver;

    protected AbstractPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }
    protected abstract AbstractPage openPage(String url);
}

临时邮件页面:

public class TempMailOrgPage extends AbstractPage {
    String regex = "^[A-Za-z0-9+_.-]+@(.+)$";
    Pattern pattern = Pattern.compile(regex);
    
    public TempMailOrgPage(WebDriver driver) {
        super(driver);
    }
    
    public TempMailOrgPage openPage(String url) {
        driver.get(url);
        driver.manage().window().maximize();
        return this;
    }
    @FindBy(xpath = "//input[@id='mail']")
    WebElement mailField;

    public TempMailOrgPage getAddress() {
        //new WebDriverWait(driver, 10).until(ExpectedConditions.textToBePresentInElement(mailField, regex));
        new WebDriverWait(driver, 10).until(ExpectedConditions.textMatches((By) mailField, pattern));
        System.out.println(mailField.getAttribute("value"));
        return this;
    }
}

和测试

public class MainTest {
    WebDriver driver;
    
    @BeforeMethod(alwaysRun = true)
    public void browserRun() {
        WebDriverManager.firefoxdriver().setup();
        driver = new FirefoxDriver();
    }
    @Test(description = "try get addresb")
    public void scenarioWithCopyingEmail()  {
        new TempMailOrgPage(this.driver)
                .openPage("https://temp-mail.org/")
                .getAddress();
    }
    
    @AfterMethod(alwaysRun = true)
    public void afterTestCompleted() {
        driver.quit();
        driver = null;
    }
}

在测试运行后我得到错误。我了解等待然后生成电子邮件地址的错误。

而不是一个词“加载”将是邮件地址。在这一行中,我尝试使用模式:

 new WebDriverWait(driver, 10).until(ExpectedConditions.textMatches((By) mailField, pattern));

我在等待有什么错?

ps用thread.sleep不是办法。

标签: javaseleniumwebdriver

解决方案


问题

我认为问题在于网络元素[mailField]实际上没有文本变量。

我尝试以下代码:

driver.get("https://temp-mail.org");
Thread.sleep(60000);
System.out.println(driver.findElementById("mail").getText());

等待 60 秒,虽然 ui 显示电子邮件。系统仍然打印出空白元素。[textMatches]方法将获取 Web 元素的文本以与正则表达式进行比较。当 web 元素没有文本或文本为空白时,它应该如何比较。所以当然它总是会抛出超时异常。

解决方案

我找不到其他实际上像[textMatches]并且能够应用于[getAttribue("value")]的方法。因此,您可以将此解决方案视为一种工作方式。等待属性值包含[@]

new WebDriverWait(driver, 20)
    .until(ExpectedConditions
    .attributeContains(driver.findElementById("mail"), "value", "@"));

System.out.println(driver.findElementById("mail").getAttribute("value"));

我测试时工作得很好

borik68628@heroulo.com

推荐阅读