Драйвер Selenium на следующей кнопке Google, исключение NoSuchElementException

#python #html #selenium #selenium-webdriver

#python #HTML #selenium #selenium-webdriver

Вопрос:

Я пишу скрипт, который работает с Google. Я успешно искал то, что хотел, используя веб-драйвер selenium, однако я хотел бы перейти к следующей странице результатов. мой код выглядит следующим образом:

 import parameters
import csv

from parsel import Selector
from selenium import webdriver
from time import sleep
from selenium.webdriver.common.keys import Keys
empty=""
def validate_field(field):
    if field == "":
        field= 'No results'
    return field 



writer=csv.writer(open(parameters.file_name, 'w'))
writer.writerow(('Name','Job Title','Company','College','Location','URL'))

driver=webdriver.Chrome('/usr/local/bin/chromedriver')
driver.implicitly_wait(10)
driver.get('https://www.linkedin.com')
username=driver.find_element_by_id('session_key') #locating the email form using the class name
username.send_keys('')
sleep(0.5)
password=driver.find_element_by_id('session_password') #locating the password form using the class name
password.send_keys('')
sleep(0.5)
log_in_button=driver.find_element_by_class_name('sign-in-form__submit-button') #locating submit button by class name
log_in_button.click() #here we are mimicing a click
sleep(0.5)
driver.get('https:www.google.com') #navigating to google
sleep(3)
search_gog=driver.find_element_by_name('q')
search_gog.send_keys(parameters.search_gog)
sleep(0.5)
search_gog.send_keys(Keys.RETURN)
sleep(3)

list_links = [link.get_attribute('href') for link in driver.find_elements_by_xpath("//div[@class='g']//div[@class='r']/a[contains(@href, 'https://www.linkedin.com')]")]

    for link in list_links:
        driver.get(link)
        sel=Selector(text=driver.page_source)
        name = sel.xpath('//*[starts-with(@class, "inline t-24 t-black t-normal break-words")]/text()').extract_first()
        if name:
            name=name.strip()
        job_title= sel.xpath('//*[starts-with(@class, "mt1 t-18 t-black t-normal break-words")]/text()').extract_first()
        if job_title:
            job_title=job_title.strip()

        education = sel.xpath('//*[starts-with(@class, "pv-profile-section-pager ember-view")]/text()').extract_first()
        if education:
            education=education.strip()
        name=validate_field(name)
        job_title=validate_field(job_title)
        education=validate_field(education)

   
        print('n')
        print('Name: '   name)
        print('Job Title: '   job_title)
        print('Education: '   education)
        print(education)
        print('URL: '   driver.current_url)
        print('n')
   


driver.find_element_by_link_text("Next").click()

  

файл параметров содержит поисковый запрос Google, в котором указано:

 search_gog = 'site:linkedin.com/in/ AND "data analyst" AND "California"'
  

после выполнения вышеуказанного я получаю следующую ошибку:

 Traceback (most recent call last):
  File "app2.py", line 79, in <module>
    driver.find_element_by_link_text("Next").click()
  File "/Users/rubenolmos/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 428, in find_element_by_link_text
    return self.find_element(by=By.LINK_TEXT, value=link_text)
  File "/Users/rubenolmos/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 976, in find_element
    return self.execute(Command.FIND_ELEMENT, {
  File "/Users/rubenolmos/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/Users/rubenolmos/opt/anaconda3/lib/python3.8/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"link text","selector":"Next"}
  (Session info: chrome=85.0.4183.102)


  

Я также пытался использовать html-код для элемента, который:

 <a href="/search?q=site:linkedin.com/in/ AND "data analyst" AND "California"amp;amp;ei=lbpbX4GhDoPs9APDmITID
Aamp;amp;start=10amp;amp;sa=Namp;amp;ved=2ahUKEwjBv57e1uHrAhUDNn0KHUMMAckQ8NMDegQICxA_" 
id="pnnext" style="text-align:left"><span class="SJajHc NVbCr" 
style="background:url(/images/nav_logo299_hr.webp) no-repeat;background-position:-96px 
0;background-size:167px;width:71px"></span><span style="display:block;margin-
left:53px">Next</span></a>

  

используя приведенный выше HTML-элемент, я попытался найти элемент, используя идентификатор элемента «pnnext», выполнив следующий find_element_by_id(«pnnext»).нажмите, и это не увенчалось успехом.
Есть идеи?

Комментарии:

1. Вы должны скрыть свой адрес электронной почты и пароль, если они настоящие.

2. Я создал учетную запись как ненужную для этого проекта. изменил его, чтобы избежать необходимости создавать еще один вариант.

Ответ №1:

Во-первых, если у вас есть driver.implicitly_wait(10) , то при выполнении driver.find_element_by_link_text("Next").click() следующего search_gog.send_keys(Keys.RETURN) действия драйвер будет ждать до 10 секунд, пока загрузится следующая страница и появится ссылка с текстом «Далее», прежде чем выдавать исключение. Итак, вызов sleep(3) , который вы вызываете между двумя вызовами, довольно излишен. Если по какой-либо причине вы думали, что 10 секунд было недостаточно (трудно поверить в google.com ), затем просто увеличьте время на вызов driver.implicitly_wait .

Я не могу сказать, каков ваш аргумент поиска в Google, но вполне возможно, что количество возвращенных результатов недостаточно, чтобы гарантировать «Следующую» ссылку. Измените свой код следующим образом:

 search_gog.send_keys(Keys.RETURN)
next_links = driver.find_elements_by_link_text("Next") # note it is find_elements with an s
if len(next_links):
    next_links[0].click()
else:
    print('There is no "Next" link')
  

Обновить

Я запускал следующий код на своем рабочем столе 5 раз подряд, и каждый раз он успешно переходил на вторую страницу (то есть он нашел ссылку «Далее» и успешно нажал на нее).

 from selenium import webdriver
from selenium.webdriver.common.keys import Keys

options = webdriver.ChromeOptions()
#options.add_argument("headless")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)

try:
    driver.implicitly_wait(10)
    driver.get('https://www.google.com') #navigating to google
    search_gog=driver.find_element_by_name('q')
    search_gog.send_keys('site:linkedin.com/in/ AND "data analyst" AND "California"')
    search_gog.send_keys(Keys.RETURN)
    next_links = driver.find_elements_by_link_text("Next") # note it is find_elements with an s
    if len(next_links):
        print('Found "Next" link')
        next_links[0].click()
    else:
        print('There is no "Next" link')
finally:
    input('pausing (hit enter to terminate) ...')
    driver.quit()
  

Комментарии:

1. Избавьтесь от безголового режима, если вы его используете, и добавьте «паузу», input('pausing ...') следуя print('There is no "Next" link') , чтобы просмотреть фактические результаты запроса и посмотреть, имеет ли это смысл. Возможно, ваша строка ввода в запрос неверна, поэтому вы также можете распечатать ее.

2. Да, посмотрите на результат запроса от Google. Вы видите ссылку «Далее»? Если вы это сделаете, воспользуйтесь возможностью проверки браузера, чтобы просмотреть ссылку, чтобы убедиться, что ссылка содержит только «Next» и ничего больше. Если вы не видите ссылку «Далее», это потому, что есть результаты только на одной странице? Если да, то почему это проблема? Программа будет оставаться на «паузе», пока вы не введете что-либо, за чем следует клавиша ввода. Это было сделано только для того, чтобы предотвратить завершение работы формы программы и закрытие окна браузера.

3. Если бы я знал, какова ваша фактическая строка поискового запроса, я мог бы лучше понять, что происходит.

4. На самом деле, я вижу это сейчас из закодированной трассировки стека.

5. Я обновил свой ответ кодом, который выполняется последовательно и успешно. Все, что я могу сказать, это то, что вам следует тщательно сравнить его с вашим.

Ответ №2:

selenium.common.exceptions.Исключение NoSuchElementException означает, что он не может найти элемент, это может быть вызвано слишком долгой загрузкой элементов или неправильным XPath. Также может быть iframe.

 elem=WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.ID('pnnext')))
elem.click()
  

Импортируйте их.

 from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
  

Комментарии:

1. Привет, я получил сообщение об ошибке, что id не является атрибутом By