Поиск элементов с селеном - PullRequest
2 голосов
/ 04 мая 2020

Так что это элемент имени пользователя https://twitter.com/login:

<input autocapitalize="none" autocomplete="on" autocorrect="off" 
name="session[username_or_email]" spellcheck="false" type="text" 
dir="auto" data-focusable="true" class="r-30o5oe r-1niwhzg r-17gur6a 
r-1yadl64 r-deolkf r-homxoj r-poiln3 r-7cikom r-1ny4l3l r-1inuy60 r- 
utggzx r-vmopo1 r-1w50u8q r-641cr4 r-1dz5y72 r-1ttztb7 r-13qz1uu" 
value="">

Я могу найти его с помощью:

driver.find_element_by_name("session[username_or_email]")

, но не:

driver.find_element_by_class_name("r-30o5oe r-1niwhzg r-17gur6a r-1yadl64 r-deolkf r-homxoj 
r-poiln3 r-7cikom r-1ny4l3l r-1inuy60 r-utggzx r-vmopo1 r-1w50u8q r-641cr4 r-1dz5y72 r- 
1ttztb7 r-13qz1uu")

Почему это так?

Ошибка:

Traceback (most recent call last):
  File "s.py", line 9, in <module>
    username = driver.find_element_by_class_name("r-30o5oe r-1niwhzg r-17gur6a r-1yadl64 r- 
deolkf r-homxoj r-poiln3 r-7cikom r-1ny4l3l r-1inuy60 r-utggzx r-vmopo1 r-1w50u8q r-641cr4 
r-1dz5y72 r-1ttztb7 r-13qz1uu")
  File "/home/nu7up/.local/lib/python3.6/site- 
packages/selenium/webdriver/remote/webdriver.py", line 564, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "/home/nu7up/.local/lib/python3.6/site- 
packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/home/nu7up/.local/lib/python3.6/site- 
packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/home/nu7up/.local/lib/python3.6/site- 
packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .r- 
30o5oe r-1niwhzg r-17gur6a r-1yadl64 r-deolkf r-homxoj r-poiln3 r-7cikom r-1ny4l3l r-1inuy60 
r-utggzx r-vmopo1 r-1w50u8q r-641cr4 r-1dz5y72 r-1ttztb7 r-13qz1uu

Элемент кнопки отправки следующий:

<div aria-haspopup="false" role="button" class="css-18t94o4 css-1dbjc4n 
r-urgr8i r-42olwf r-sdzlij r-1phboty r-rs99b7 r-1w2pmg r-vlx1xi r-zg41ew 
r-1jayybb r-17bavie r-15bsvpr r-o7ynqc r-6416eg r-lrvibr" data- 
testid="LoginForm_Login_Button" data-focusable="true" tabindex="0"><div 
dir="auto" class="css-901oao r-1awozwy r-jwli3a r-6koalj r-18u37iz r- 
16y2uox r-1qd0xha r-a023e6 r-vw2c0b r-1777fci r-eljoum r-dnmrzs r-bcqeeo 
r-q4m81j r-qvutc0"><span class="css-901oao css-16my406 css-bfa6kz r- 
1qd0xha r-ad9z0x r-bcqeeo r-qvutc0"><span class="css-901oao css-16my406 
r-1qd0xha r-ad9z0x r-bcqeeo r-qvutc0">Log in</span></span></div></div>

Как найти этот элемент не используя его имя класса Dynami c?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Если вам нужно имя класса, потому что по какой-то причине это то, что вам нужно, то это работает:

from selenium.webdriver.support.ui import Select
from selenium import webdriver
import time

path = 'PATH_TO_GECKODRIVER'
driver = webdriver.Firefox(path)

driver.get('https://twitter.com/login')

time.sleep(10)

x = driver.find_element_by_class_name('r-30o5oe')
x.send_keys("ole")

w = driver.find_element_by_name('session[password]')
w.send_keys("something")

y = driver.find_element_by_xpath('//span[text()="Log in"]')

if y.is_displayed():
    print("I see the Log in button")
    y.click()
else:
    print("I can't see it")


time.sleep(5)

Указанное c имя класса:

r-30o5oe r-1niwhzg r-17gur6a r-1yadl64 r-deolkf r-homxoj 
r-poiln3 r-7cikom r-1ny4l3l r-1inuy60 r-utggzx r-vmopo1 r-1w50u8q r-641cr4 r-1dz5y72 r- 
1ttztb7 r-13qz1uu

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

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

Примечание : Спящие части кода только для вас, чтобы увидеть, что вы можете набирать его с указанным c именем класса.

0 голосов
/ 04 мая 2020

В CSS имена классов не должны содержать пробелов. То, с чем вы имеете дело, это набор отдельных имен классов. Итак, если вы хотите, чтобы этот точный набор классов был указан в вашем коде - хотя это может быть громоздким - вы должны сделать запрос с помощью селектора CSS. Но вы должны объединить занятия.

Вот так.

driver.find_elements_by_css_selectors(".r-30o5oe.r-1niwhzg.r-17gur6a.r-1yadl64.r-deolkf.r-homxoj.r-poiln3.r-7cikom.r-1ny4l3l.r-1inuy60.r-utggzx.r-vmopo1.r-1w50u8q.r-641cr4.r-1dz5y72.r-1ttztb7.r-13qz1uu")

Обратите внимание, что будет возвращено более одного элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...