java - 如何使用 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不是办法。
解决方案
问题
我认为问题在于网络元素[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
推荐阅读
- php - 正则表达式 该帖子首先出现在
- javascript - 如何在花括号内的表达式周围放置强标签?
- database - Sqlite中B-Tree的度数是多少?
- python - 将同一行中的多个值连接到列表中
- c++ - OpenMP 和 GMP 瓶颈问题
- java - 如何检查方法是否返回null?
- javascript - 灰烬数据。如何将模型中未定义的属性发送到服务器?
- mdx - 基于其他维度值的 MDX 动态维度过滤器
- c# - Oracle.ManagedDataAccess 的 OracleBulkCopy(string connectionString) 的等价物是什么?
- javascript - 矩形api谷歌地图v3的高度和宽度