Это типичный org.openqa.selenium.WebDriverException
, который продолжается java.lang.RuntimeException
.
Поля этого исключения:
BASE_SUPPORT_URL
: protected static final java.lang.String BASE_SUPPORT_URL
DRIVER_INFO
: public static final java.lang.String DRIVER_INFO
SESSION_ID
: public static final java.lang.String SESSION_ID
О вашей индивидуальной usecase ошибка сообщает все:
WebDriverException: Element is not clickable at point (x, y). Other element would receive the click
Из вашего кодового блока видно, что вы wait
определены как WebDriverWait wait = new WebDriverWait(driver, 10);
, но вы вызываете метод click()
для элемента до того, как ExplicitWait
вступает в игру, как в until(ExpectedConditions.elementToBeClickable)
.
Ошибка Element is not clickable at point (x, y)
может возникать из-за разных факторов. Вы можете обратиться к ним с помощью одной из следующих процедур:
1. Элемент не получает клика из-за присутствия JavaScript или вызовов AJAX
Попробуйте использовать Actions
Класс:
WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();
2. Элемент не получает щелчок, поскольку он не находится в пределах Viewport
Попробуйте использовать JavascriptExecutor
, чтобы привести элемент в Viewport:
WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3. Страница становится обновленной до того, как элемент становится доступным.
В этом случае вызывают ExplicitWait
i.e WebDriverWait
, как указано в пункте 4.
4. Элемент присутствует в DOM, но не доступен для клика.
В этом случае вызывать ExplicitWait
с ExpectedConditions
, установленным на elementToBeClickable
, для элемента, который можно щелкнуть:
WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
5. Элемент присутствует, но имеет временное наложение.
В этом случае вызывать ExplicitWait
с ExpectedConditions
, установленным на invisibilityOfElementLocated
, чтобы наложение было невидимым.
WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6. Элемент присутствует, но имеет постоянный Overlay.
Используйте JavascriptExecutor
, чтобы отправить клик непосредственно на элемент.
WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
Попробуйте это
User.update({_id:ObjectId(userId),'projects.name': data.project},{$push:{'projects.$.tasks':{yourTaskObject}}})
$ в обновлении работает как оператор позиционирования, который извлекает положение родительского массива
Я нашел решение
User.update(
{ _id: Mongoose.Types.ObjectId(userId), 'projects.name': data.project },
{ $push: { 'projects.$.tasks': data.task } },
(err, data) => {
if (err) { throw err; }
return reply('success');
}
);