【问题标题】:How get value from field using Selenium java如何使用 Selenium java 从字段中获取值
【发布时间】:2021-03-13 09:06:59
【问题描述】:

我尝试从页面 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));

等待我做错了什么?

附:使用 thread.sleep 不是一种方式。

【问题讨论】:

  • mailField 表示据我所知没有任何属性值的输入字段。不确定您是否正在寻找数据值
  • 为什么类TempMailOrgPage中的方法openPage()什么都不做?不应该用driver.get()打开网址吗?
  • @Fenio :它会执行“this.driver = driver; PageFactory.initElements(driver, this);”。看到有这个和超级参与。
  • @cruisepandey 不,这就是构造函数的作用。我在问openPage() 方法,它只返回对当前对象的引用......实际打开 temp-mail.org 的代码行在哪里?
  • @Fenio :是的,我同意,代码中缺少 driver.get("")。

标签: java selenium webdriver


【解决方案1】:

问题

我认为问题在于网络元素 [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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 2017-12-01
    • 2017-01-12
    • 1970-01-01
    • 2014-01-12
    • 2022-12-10
    相关资源
    最近更新 更多