python - CSS 选择器在浏览器控制台中有效,但在 Python 中无效
问题描述
我正在尝试使用CSS 选择器使用 python登录到Investors Business Daily服务。我在 chrome 浏览器控制台中成功运行的输入标记下发现了一个唯一属性:
$$("[data-gigya-placeholder='Email']")
但是,对应的 python 不起作用:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://myibd.investors.com/secure/signin.aspx?eurl=https://marketsmith.investors.com/")
login = driver.find_element_by_css_selector("[data-gigya-placeholder='Email']")
完整的错误日志:
NoSuchElementException Traceback (最近一次调用最后一次) ~\AppData\Local\Temp/ipykernel_26004/2365346870.py in 1 # 找到输入用户名的元素 2 #login = driver.find_element_by_css_selector("input[data-gigya-placeholder='Email ']") ----> 3 登录 = driver.find_element_by_css_selector("[data-gigya-placeholder='Email']") 4 5
~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element_by_css_selector(self, css_selector) 596 element = driver.find_element_by_css_selector('#foo') 597 """ --> 598返回 self.find_element(by=By.CSS_SELECTOR, value=css_selector) 599 600 def find_elements_by_css_selector(self, css_selector):
~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element(self, by, value) 974 by = By.CSS_SELECTOR 975 value = '[name="%s"] ' % value --> 976 return self.execute(Command.FIND_ELEMENT, { 977 'using': by, 978 'value': value})['value']
~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params) 319 response = self.command_executor.execute(driver_command, params) 320 if response: - -> 321 self.error_handler.check_response(response) 322 response['value'] = self._unwrap_value(323 response.get('value', None))
~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response) 240 alert_text = value['alert'].get('text') 241 raise exception_class( message, screen, stacktrace, alert_text) --> 242 raise exception_class(message, screen, stacktrace) 243 244 def _value_or_default(self, obj, key, default):
NoSuchElementException:消息:没有这样的元素:无法找到元素:{“method”:“css selector”,“selector”:“[data-gigya-placeholder='Email']”}
我尝试了另一种 python 语法,它会导致类似的错误消息:
login = driver.find_element(By.CSS_SELECTOR, "[data-gigya-placeholder='Email']")
完整错误日志:
NoSuchElementException Traceback(最近一次通话最后)~\AppData\Local\Temp/ipykernel_23192/47655697.py in ----> 1 login = driver.find_element(By.CSS_SELECTOR, "[data-gigya-placeholder='Email'] ")
~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element(self, by, value) 974 by = By.CSS_SELECTOR 975 value = '[name="%s"] ' % value --> 976 return self.execute(Command.FIND_ELEMENT, { 977 'using': by, 978 'value': value})['value']
~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params) 319 response = self.command_executor.execute(driver_command, params) 320 if response: - -> 321 self.error_handler.check_response(response) 322 response['value'] = self._unwrap_value(323 response.get('value', None))
~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response) 240 alert_text = value['alert'].get('text') 241 raise exception_class( message, screen, stacktrace, alert_text) --> 242 raise exception_class(message, screen, stacktrace) 243 244 def _value_or_default(self, obj, key, default):
NoSuchElementException:消息:没有这样的元素:无法找到元素:{“method”:“css selector”,“selector”:“[data-gigya-placeholder='Email']”}
解决方案
首先这个元素在 iframe 里面,所以你必须切换到那个 iframe 才能访问那个元素。
你也错过了等待/延迟。
在访问它之前,您应该等待元素准备好。
最好的方法是使用预期条件的显式等待。
尝试以下操作:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
driver.get("https://myibd.investors.com/secure/signin.aspx?eurl=https://marketsmith.investors.com/")
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"#signin-iframe")))
login = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-gigya-placeholder='Email']")))
推荐阅读
- android - 在 Kotlin Coroutine 的底层,同步是如何发生的?
- python - 了解 TensorFlow 模型输入
- c# - C# - 实体框架代码优先,延迟加载不起作用
- java - 带有标头的 GET 请求以打开 URL 并在 Angular 应用程序中检索标头
- ios - iOS:如何防止 UITextField 离开屏幕
- c - 不破坏复制/粘贴的子类编辑控件
- swift - 右键单击 UIKitForMac 的 UIButton(催化剂)
- ruby-on-rails - 无法登录会话(Rails)
- python - 动态屏蔽 pandas df 以查找与列表中的字符串匹配的行
- javascript - 单击超链接图像/文本时如何播放声音(仍将您带到超链接网页)