有人帮我解决了这个问题。以下是解决方案:
我想做的是登录后,驱动程序将单击"属性"下拉列表,选择一个选项并单击"提交",然后重复此过程,直到循环完成。
以下是我的代码:
package com.genericlibrary;
import java.util.List;
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.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import com.util.Highlighter;
public class MobopsSearchJobsFromDropDown {
WebDriver driver;
Highlighter color;
public void getSetup() {
String path = System.getProperty("user.dir");
String driverPath = path + "\Driver\chromedriver.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
driver = new ChromeDriver();
driver.navigate().to("http://mobops-test.jcdecauxna.com/");
driver.manage().window().maximize();
}
public void logIntoMobops() {
WebElement userName = driver.findElement(By.xpath("//*[contains(@id,'username')]"));
WebElement passWord = driver.findElement(By.xpath("//*[contains(@id,'password')]"));
WebElement loginButton = driver.findElement(By.xpath("//*[contains(text(),'Login')]"));
userName.sendKeys("test2");
passWord.sendKeys("1234");
loginButton.click();
}
public void selectEachPropertyAndSeachJob() {
WebElement dateRange = driver.findElement(By.xpath("//*[contains(@name,'date_range')]"));
WebElement last7days = driver.findElement(By.xpath("(//*[contains(text(),'Last 7 Days')])[2]"));
WebElement searchJobs = driver.findElement(By.xpath("//*[contains(@name,'layout')]"));
WebElement propertyDropdown = driver.findElement(By.xpath("//*[contains(@id,'property_id')]"));
Select dropdown = new Select(propertyDropdown);
List<WebElement> optionsInPropertyDropdown = dropdown.getOptions();
for (int i = 0; i < optionsInPropertyDropdown.size(); i++) {
if (propertyDropdown.isDisplayed() && propertyDropdown.isEnabled()) {
try {
propertyDropdown.click();
dropdown.selectByVisibleText(optionsInPropertyDropdown.get(i).getText());
dateRange.click();
last7days.click();
searchJobs.click();
System.out.println("Option Search is " + optionsInPropertyDropdown.get(i).getText());
} catch (org.openqa.selenium.StaleElementReferenceException ex) {
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOf(propertyDropdown));
}
}
}
}
public static void main(String[] args) {
MobopsSearchJobsFromDropDown obj = new MobopsSearchJobsFromDropDown();
obj.getSetup();
obj.logIntoMobops();
obj.selectEachPropertyAndSeachJob();
}
}
现在它驱动程序只需选择第一个选项并点击提交。在搜索完成后页面加载后,我得到以下错误:
Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
我尝试在我的代码中实现以下代码,但由于我是一个新手,我不知道如何实现以下代码来解决问题:
new WebDriverWait(driver, timeout)
.ignoring(StaleElementReferenceException.class)
.until((WebDriver d) -> {
d.findElement(By.xpath("//*[contains(@id,'property_id')]")).click();
return true;
});
我们非常感谢为解决这一问题所提供的任何帮助。谢谢
public class MobopsSearchJobsFromDropDown {
WebDriver driver;
HighLighter color;
public void getSetup() throws Throwable {
String path = System.getProperty("user.dir");
String driverPath = path + "\driver\chromedriver.exe";
System.setProperty("webdriver.chrome.driver", driverPath);
driver = new ChromeDriver();
driver.navigate().to("http://mobops-test.jcdecauxna.com/");
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.manage().window().maximize();
}
public void logIntoMobops() throws Throwable {
WebElement userName = driver.findElement(By.xpath("//*[contains(@id,'username')]"));
WebElement passWord = driver.findElement(By.xpath("//*[contains(@id,'password')]"));
WebElement loginButton = driver.findElement(By.xpath("//*[contains(text(),'Login')]"));
userName.sendKeys("test2");
passWord.sendKeys("1234");
loginButton.click();
}
public void selectEachPropertyAndSeachJob() throws Throwable {
WebDriverWait wait = new WebDriverWait(driver, 30);
List<WebElement> dropdownoptions = driver.findElements(By.xpath("//select[@id = 'property_id']//option"));
for(int i =0; i<dropdownoptions.size(); i++) {
String propertyDropdown = "//*[contains(@id,'property_id')]";
String dateRange = "//*[contains(@name,'date_range')]";
String last7days = "(//*[contains(text(),'Last 7 Days')])[2]";
String searchJobs = "//*[contains(@name,'layout')]";
Select dropdown = new Select(waitMethod(propertyDropdown));
WebElement option = dropdown.getOptions().get(i);
wait.until(ExpectedConditions.not(ExpectedConditions.stalenessOf(option)));
dropdown.selectByVisibleText(option.getText());
System.out.println(option.getText());
waitMethod(dateRange).click();
waitMethod(last7days).click();
waitMethod(searchJobs).click();
driver.navigate().refresh();
}
}
public WebElement waitMethod(String waiting) {
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement waitForRefresh =wait.until(ExpectedConditions.refreshed(ExpectedConditions.presenceOfElementLocated(By.xpath(waiting))));
return waitForRefresh;
}
public static void main(String[] args) throws Throwable {
MobopsSearchJobsFromDropDown obj = new MobopsSearchJobsFromDropDown();
obj.getSetup();
obj.logIntoMobops();
obj.selectEachPropertyAndSeachJob();
}
}
执行searchJobs.click((后;您的页面将重新加载,因此对以前找到的元素的所有引用都将丢失。您需要在搜索Jobs.click((后再次获取所有WebElements、Select下拉列表和选项列表;在第二次使用之前。因此,不要保存网络元素。
像这样的东西应该起作用:
public void selectEachPropertyAndSeachJob() {
Select dropdown = new Select(driver.findElement(By.xpath("//*[contains(@id,'property_id')]")));
List<WebElement> optionsInPropertyDropdown = dropdown.getOptions();
for (int i = 0; i < optionsInPropertyDropdown.size(); i++) {
if (driver.findElement(By.xpath("//*[contains(@id,'property_id')]")).isDisplayed()) {
//propertyDropdown.click(); no need to click
dropdown.selectByVisibleText(optionsInPropertyDropdown.get(i).getText());
driver.findElement(By.xpath("//*[contains(@name,'date_range')]")).click();
driver.findElement(By.xpath("(//*[contains(text(),'Last 7 Days')])[2]")).click();
driver.findElement(By.xpath("//*[contains(@name,'layout')]")).click();
// Need to find it again
dropdown = new Select(driver.findElement(By.xpath("//*[contains(@id,'property_id')]")));
optionsInPropertyDropdown = dropdown.getOptions();
System.out.println("Option Search is " + optionsInPropertyDropdown.get(i).getText());
}
}
}
您可以将定位器保存为By元素并创建自定义查找方法,而不是每次都使用driver.findElement。