Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 用硒寻找元素_Python 3.x_Selenium_Selenium Webdriver_Automation - Fatal编程技术网

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