所以,我有一个隐藏在警报下的元素。警报保持10秒,用户可以在此之后单击该元素。这是我处理这种情况的代码:
WebElement create = driver.findElement(By.cssSelector("div.action_menu_trigger"));
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(create));
create.click();
但是一旦WebDriver到达这里我就会得到这个例外,看起来Selenium并不关心等待方法:
org.openqa.selenium.ElementClickInterceptedException:
Element <div class="action_menu_trigger"> is not clickable at point (1710.224952697754,140) because another element <div class="noty_body"> obscures it
Build info: version: '3.13.0', revision: '2f0d292', time: '2018-06-25T15:24:21.231Z'
我尝试使用Thread.sleep(10000)
,它工作正常但我不想使用睡眠。
这里的问题是,就Selenium所知,警报下的元素是可点击的。它是可见的并且已启用,因此它应该是可点击的。您的代码等待元素可点击(假设它将等待警报消失),但Selenium已经认为该元素是可点击的,因此它会立即尝试点击,从而导致出现错误消息,因为警报仍然响起并阻止了点击。
解决这个问题的方法是等待警报出现然后消失,等待元素可点击,然后单击它。我不知道我有所有的定位器,但下面的代码应该让你指向正确的方向。
// define locators for use later
// this also makes maintenance easier because locators are in one place, see Page Object Model
By alertLocator = By.cssSelector("div.noty_body");
By createLocator = By.cssSelector("div.action_menu_trigger");
// do something that triggers the alert
// wait for the alert to appear and then disappear
WebDriverWait shortWait = new WebDriverWait(driver, 3);
WebDriverWait longWait = new WebDriverWait(driver, 30);
shortWait.until(ExpectedConditions.visibilityOfElementLocated(alertLocator));
longWait.until(ExpectedConditions.invisibilityOfElementLocated(alertLocator));
// now we wait for the desired element to be clickable and click it
shortWait.until(ExpectedConditions.elementToBeClickable(createLocator)).click();
而不是在elementToBeClickable中给出web元素,只需给定位器提供css选择器。
您正在尝试在等待之前找到该元素。
所以代码是这样的:
create = wait.until(ExpectedConditions.visibilityOfElement(By.cssSelector(“your css selector”)));
create.click();
可以通过使用Actions对象来解决“不可点击的点”:
WebElement create = driver.findElement(By.cssSelector("div.action_menu_trigger"));
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(create));
Actions actions = new Actions(driver);
actions.moveToElement(create).perform();
actions.click().perform();
您没有正确使用WebDriverWait
。这个:
WebElement create = driver.findElement(By.cssSelector("div.action_menu_trigger"));
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(create));
create.click();
应该是这样的:
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.action_menu_trigger"))).click();
正如@cruisepandey已经提到的,
WebElement create = driver.findElement(By.cssSelector("div.action_menu_trigger"));
找到元素,之后WebDriverWait
没有效果。
编辑:您可以尝试使用此:
int i = 0;
while (true){
i++;
WebElement create = driver.findElement(By.cssSelector("div.action_menu_trigger"));
try {
create.click();
break;
}catch (Exception e){
if (i > 30){
create.click(); // throws exception after 15 sec to prevent infinite loop
}
Thread.sleep(500); // pause 0.5 sec
// try one more time
}
}