NoSuchElementExeption, селен не может найти элемент
Я хотел бы найти свой TextField в селене, но я не знаю, как (я использую Sellenium в первый раз).
Я старался:
driver.findElement(By.id("originTextField"))
или xPath и cssSelector String, сгенерированные chrome в инструментах разработки.
Пожалуйста, помогите мне, я был бы признателен за объяснение.
это HTML:
2 ответа
NoSuchElementException
org.openqa.selenium.NoSuchElementException, широко известный как NoSuchElementException, расширяет org.openqa.selenium.NotFoundException, который является типом WebDriverException.
NoSuchElementException может быть выброшено в 2 случаях следующим образом:
Когда используешь
WebDriver.findElement(By by)
://example : WebElement my_element = driver.findElement(By.xpath("//my_xpath"));
Когда используешь
WebElement.findElement(By by)
://example : WebElement my_element = element.findElement(By.xpath("//my_xpath"));
Что касается JavaDocs, как и любого другого WebDriverException, NoSuchElementException должен содержать следующие поля констант:
Constant Field Type Value
SESSION_ID public static final java.lang.String "Session ID"
e.g. (Session info: chrome=63.0.3239.108)
DRIVER_INFO public static final java.lang.String "Driver info"
e.g. (Driver info: chromedriver=2.34.522940 (1a76f96f66e3ca7b8e57d503b4dd3bccfba87af1),platform=Windows NT 6.1.7601 SP1 x86)
BASE_SUPPORT_URL protected static final java.lang.String "http://seleniumhq.org/exceptions/"
e.g. (For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html)
причина
Причиной исключения NoSuchElementException может быть одно из следующих:
- Принятая вами стратегия локатора не идентифицирует ни одного элемента в HTML DOM.
- Принятая вами стратегия локатора не может идентифицировать элемент, так как ее нет в области просмотра браузера.
- Стратегия локатора, которую вы приняли, идентифицирует элемент, но невидим из-за наличия атрибута style="display: none;",
- Принятая вами стратегия локатора не однозначно идентифицирует нужный элемент в HTML DOM и в настоящее время находит какой-то другой скрытый / невидимый элемент.
- WebElement, который вы пытаетесь найти, находится в пределах
<iframe>
тег. - Экземпляр WebDriver ищет WebElement еще до того, как элемент присутствует / отображается в HTML DOM.
Решение
Решение для устранения NoSuchElementException может быть одним из следующих:
Примите стратегию локатора, которая однозначно идентифицирует желаемый веб-элемент. Вы можете воспользоваться помощью Инструментов разработчика (Ctrl + Shift + I или F12) и использовать Element Inspector.
Здесь вы найдете подробное обсуждение того, как проверять элемент в селене 3.6, так как firefug больше не подходит для FF 56?
использование
executeScript()
метод прокрутки элемента для просмотра следующим образом:WebElement elem = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView();", elem);
Здесь вы найдете подробное обсуждение прокрутки к началу страницы в Python с использованием Selenium
Элемент Incase имеет атрибут style="display: none;" удалите атрибут через
executeScript()
метод следующим образом:WebElement element = driver.findElement(By.xpath("element_xpath")); ((JavascriptExecutor)driver).executeScript("arguments[0].removeAttribute('style')", element) element.sendKeys("text_to_send");
Чтобы проверить, находится ли элемент в пределах
<iframe>
просмотрите HTML, чтобы найти соответствующий<iframe>
тег иswitchTo()
желаемый iframe одним из следующих способов:driver.switchTo().frame("frame_name"); driver.switchTo().frame("frame_id"); driver.switchTo().frame(1); // 1 represents frame index
Здесь вы можете найти подробное обсуждение возможности перехода к элементу во фрейме без использования driver.switchTo(). Frame(“frameName”) в Selenium Webdriver Java?,
Если элемент не присутствует / не виден в HTML DOM немедленно, вызовите WebDriverWait с ExpectedConditions, установленным в правильный метод, следующим образом:
Чтобы ожидать наличия OfElementLocated:
new WebDriverWait(driver, 20).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
Чтобы ожидать visibilityOfElementLocated:
new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
Для ожидания elementToBeClickable:
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='buttonStyle']//input[@id='originTextField']")));
Ваш код верен, я подозреваю, что проблема вызвала загрузку страницы, когда вы нашли элемент.
Попробуйте добавить длинный сон перед поиском элемента, если добавление сна сработало, измените сон на ожидание.
Вот код, это означает ожидание 10 секунд, если элемент отсутствует:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "originTextField"))
)
Код ниже поможет вам решить эту проблему.
wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("originTextField")));
или
wait = new WebDriverWait(driver, 90);
wait.until(ExpectedConditions.visibilityOf(element)).wait(20);