Python 3.x 用硒寻找元素
这就是用户名元素: 但不是:Python 3.x 用硒寻找元素,python-3.x,selenium,selenium-webdriver,automation,Python 3.x,Selenium,Selenium Webdriver,Automation,这就是用户名元素: 但不是: 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 rece
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
回溯(最近一次呼叫最后一次):
文件“s.py”,第9行,在
用户名=驱动程序。通过类名称(“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-1TZTB7 r-13qz1uu“
文件“/home/nu7up/.local/lib/python3.6/site-
packages/selenium/webdriver/remote/webdriver.py”,第564行,按类名称查找元素
返回self.find_元素(by=by.CLASS_NAME,value=NAME)
文件“/home/nu7up/.local/lib/python3.6/site-
packages/selenium/webdriver/remote/webdriver.py”,第978行,在find_元素中
'value':value})['value']
文件“/home/nu7up/.local/lib/python3.6/site-
文件包/selenium/webdriver/remote/webdriver.py”,第321行,执行
self.error\u handler.check\u响应(响应)
文件“/home/nu7up/.local/lib/python3.6/site-
packages/selenium/webdriver/remote/errorhandler.py”,第242行,在check_响应中
引发异常类(消息、屏幕、堆栈跟踪)
selenium.common.exceptions.NoSuchElementException:消息:无法定位元素:.r-
30o5oe r-1niwhzg r-17gur6a r-1yadl64 r-deolkf r-homxoj r-poiln3 r-7cikom r-1ny4l3l r-1NUY60
r-utggzx r-vmopo1 r-1w50u8q r-641cr4 r-1dz5y72 r-1TZTB7 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>
登录
如何不使用该元素的动态类名来查找该元素?如果出于某种原因需要该类名,则此操作有效:
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)
特定类名:
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
不是一个好的类名,因为它具有动态值。这意味着,如果将来该属性的类发生更改,那么您的整个脚本也将停止。对于这种情况,您需要的是一个稳定的属性
不过,正如我之前所说的,包括对代码的回答,它将与我的案例一样有效。我所做的是只选择类名的第一部分,因为我想减少获得登录页面其他部分也可能使用的内容的机会
注意:代码的睡眠部分只供您查看,您可以使用特定的类名在其上键入。在CSS中,类名不应包含空格。您要处理的是一组单独的类名。因此,如果您确实希望在代码中指定一组确切的类(尽管可能很麻烦),那么您必须借助CSS选择器进行查询。但是你必须连锁上课 像这样
driver.通过css选择器(“r-30o5oe.r-1niwhzg.r-17gur6a.r-1yadl64.r-deolkf.r-homxoj.r-poiln3.r-7cikom.r-1ny4l3l.r-1NUY60.r-utggzx.r-vmopo1.r-1w50u8q.r-641cr4.r-1dz5y72.r-1TTTZ7.r-13QZ1”)查找元素。
请注意,它将返回多个元素。此类名不是静态的,因此不适合收集。如果有明确的名称可供选择,为什么需要收集?您的意思是,在我的浏览器中,它与我尝试使用selenium访问它时不同?我需要收集它,因为提交按钮只有一个类,没有名称。我将在编辑中包括提交按钮。它同时适用于用户名字段和提交按钮。谢谢!:)我在我原来的帖子中加入了一个提交按钮元素。如何在不使用类名的情况下找到它?@smart\u beaver检查新代码。现在你也可以点击按钮了。我所做的是,我试图从包含等于“登录”的文本(text())的span元素中获取XPATH。希望这对你有帮助(非常感谢:)随时!若你们以后还有其他问题的话,请ping me哈哈:)他试着用类名而不是CSS来做。问题是这些动态元素根本不安全。即使它们是CSS或类名,因为它们经常更改。正如您已经编写的,这些动态CSS或类名也可能属于平台中的许多属性。所以,我们可能还有不止一个。因此,这些选择器就像,比方说,违禁品。最初的问题是“为什么”而不是“如何”。当然,但从我所看到的情况来看,“如何”也是间接需要的。在任何情况下,如果您认为我的解释不清楚,请随意编辑我的答案:)我可以使用其中一个(.r-30o5oe)获得两个元素。
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)
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