#python-3.x #selenium #xpath
#python-3.x #селен #xpath
Вопрос:
Я пытаюсь очистить страницу со многими строками данных. Эти данные распределены по нескольким страницам, на каждой странице всего 25 строк, если не изменить раскрывающийся список внизу.
Я просмотрел обычный выбор классов и имен в Selenium, и в нем нет ничего такого простого. В нем есть имена классов, но это несколько имен в одном классе, с которыми find_by_class_name не будет работать.
Из моего исследования я должен использовать xpath, однако все мои попытки, приведенные ниже, не увенчались успехом.
Я также пытался просто изменить страницу, но возникает та же проблема, когда кнопки недоступны без xpath, а xpath не будет работать.
Я попытался собрать Xpath из расширений xpath, чтобы получить его точно, и Selenium по-прежнему выдает мне ошибку.
Это фрагмент HTML-кода, который является выпадающим списком, который я должен щелкнуть
<select ng-model="ctrl.limit" ng-options="pageSize as pageSize for pageSize in ctrl.pageSizeOptions" ng-change="ctrl.onPageSizeChange()" class="ng-pristine ng-untouched ng-valid ng-not-empty" aria-invalid="false"><option label="25" value="number:25" selected="selected">25</option><option label="50" value="number:50">50</option><option label="100" value="number:100">100</option><option label="500" value="number:500">500</option></select>
и вот как это выглядит визуально
Это текущий xpath, который дает мне мое расширение, и как я передаю его в Selenium
select = Select(driver.find_element_by_xpath("/html[@class=' geolocation svg localstorage sessionstorage audio canvas canvastext video webgl no-emoji inlinesvg supports svgclippaths smil nthchild cssanimations csscolumns csscolumns-width csscolumns-span csscolumns-fill csscolumns-gap csscolumns-rule csscolumns-rulecolor csscolumns-rulestyle csscolumns-rulewidth csscolumns-breakbefore csscolumns-breakafter csscolumns-breakinside cssfilters flexbox flexboxlegacy']/body[@class='nav-menu-open']/blocking-notifications/span/ng-transclude/content-with-sidebar[@class='content-and-sidebar']/div[@class='flex-main page-main']/main[@class='flex-section page-content ntux-wrapper sidebar-open--ntux']/div[@class='tester-app view-contents--ntux']/ng-transclude/content-slot/div[@class='view-contents']/ui-view/div[@class='testcycle main-page-content is-ttl']/div[@class='tab-content']/div[@class='testcase-list main-page-content']/responsive-table/div/div[@class='responsive-table-wrap']/div[@class='responsive-table-pagination']/span/select[@class='ng-pristine ng-valid ng-not-empty ng-touched']"))
select.select_by_visible_text('500')
и ошибка
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:
Ожидаемый элемент выбран и может быть открыт с помощью дальнейших команд
Актуально — я получаю сообщение об ошибке, указывающее, что элемент не существует
Спасибо за любую помощь!
Комментарии:
1. доступна ли страница в общественном достоянии, если да, можете ли вы опубликовать ссылку?
2. @Ravi Нет, извините. Это то же самое, что и мой последний вопрос. Это за стеной.
3. На самом деле вы ничего не выбрали, только создали
select
объект. Для ошибки вы можете добавить явное ожидание4. Я не писал дальнейший код. Возможно, я не был ясен. Проблема в том, что Selenium заявляет, что элемент не существует. У меня есть select.select_by_value (‘500’) и я безуспешно попробовал ваше выше. Я отредактирую вопрос, чтобы отразить это.
5. Это проблема из-за предоставляемого вами элемента xpath, попробуйте с любым предыдущим элементом, у которого есть тег id, и получите следующий элемент или попробуйте с частичным именем класса
Ответ №1:
Можете ли вы попробовать следующий код, чтобы посмотреть, поможет ли это.
select=Select(driver.find_element_by_css_selector("select.ng-pristine.ng-untouched.ng-valid.ng-not-empty"))
select.select_by_visible_text("500")
или.
driver.find_element_by_css_selector("select.ng-pristine.ng-untouched.ng-valid.ng-not-empty").click()
driver.find_element_by_css_selector("select.ng-pristine.ng-untouched.ng-valid.ng-not-empty").send_keys(Keys.END)
driver.find_element_by_css_selector("select.ng-pristine.ng-untouched.ng-valid.ng-not-empty").send_keys(Keys.ENTER)
Комментарии:
1. Извините @Kajal. Я не писал дальнейший код. Возможно, я не был ясен. Проблема в том, что Selenium заявляет, что элемент не существует. У меня есть select.select_by_value (‘500’) и я безуспешно попробовал ваше выше. Я отредактирую вопрос, чтобы отразить это.
2. если вы используете selected by value, это не сработает. поскольку значение не «500», а «число: 500», пожалуйста, проверьте html.
3. Я пробовал оба. Я думаю, проблема в том, что xpath неверен для начала. Вот где появляется ошибка. Вот почему я не включил выбор впоследствии.
4. Спасибо за редактирование. Казалось бы, он все еще не может найти элемент :/
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"select.ng-pristine.ng-untouched.ng-valid.ng-not-empty"}
5. HTML, который вы опубликовали, отлично работает на моем ноутбуке. Пожалуйста, подождите некоторое время, прежде чем обращаться к элементу