【问题标题】:CSS Selector Works in Browser Console But Not in PythonCSS 选择器在浏览器控制台中有效,但在 Python 中无效
【发布时间】:2021-12-18 03:20:22
【问题描述】:

我正在尝试使用 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 在 1 # 找到输入用户名的元素 2 #login = driver.find_element_by_css_selector("input[data-gigya-placeholder='Email']") ----> 3 login = driver.find_element_by_css_selector("[data-gigya-placeholder='Email']") 4 5

~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py 在 find_element_by_css_selector(self, css_selector) 第596章 第597章 --> 598 返回 self.find_element(by=By.CSS_SELECTOR, value=css_selector) 599 600 def find_elements_by_css_selector(自我,css_selector):

~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py 在 find_element(self, by, value) 中 974 by = By.CSS_SELECTOR 975 价值 = '[name="%s"]' % 价值 --> 976 返回 self.execute(Command.FIND_ELEMENT, { 第977章 第978章

~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py 在执行(自我,driver_command,参数) 319 响应 = self.command_executor.execute(driver_command,参数) 320 如果响应: --> 321 self.error_handler.check_response(响应) 322响应['值'] = self._unwrap_value( 323 response.get('value',无))

~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\errorhandler.py 在 check_response(self, response) 240 alert_text = value['alert'].get('text') 241 引发异常类(消息、屏幕、堆栈跟踪、警报文本) --> 242 引发异常类(消息、屏幕、堆栈跟踪) 243 244 def _value_or_default(self, obj, key, default):

NoSuchElementException:消息:没有这样的元素:无法定位 元素:{“方法”:“css 选择器","选择器":"[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 在 ----> 1 login = driver.find_element(By.CSS_SELECTOR, "[data-gigya-placeholder='Email']")

~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py 在 find_element(self, by, value) 中 974 by = By.CSS_SELECTOR 975 价值 = '[name="%s"]' % 价值 --> 976 返回 self.execute(Command.FIND_ELEMENT, { 第977章 第978章

~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\webdriver.py 在执行(自我,driver_command,参数) 319 响应 = self.command_executor.execute(driver_command,参数) 320 如果响应: --> 321 self.error_handler.check_response(响应) 322响应['值'] = self._unwrap_value( 323 response.get('value',无))

~\miniconda3\envs\selenium_env\lib\site-packages\selenium\webdriver\remote\errorhandler.py 在 check_response(self, response) 240 alert_text = value['alert'].get('text') 241 引发异常类(消息、屏幕、堆栈跟踪、警报文本) --> 242 引发异常类(消息、屏幕、堆栈跟踪) 243 244 def _value_or_default(self, obj, key, default):

NoSuchElementException:消息:没有这样的元素:无法定位 元素:{“方法”:“css 选择器","选择器":"[data-gigya-placeholder='Email']"}

【问题讨论】:

    标签: python selenium css-selectors selenium-chromedriver


    【解决方案1】:

    首先,该元素位于 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']")))
    

    【讨论】:

    • 这给了我:“TimeoutException:消息:”我在 Udemy 课程中完成了类似的任务,但没有使用任何 wait
    • 嗯,这个元素也在 iframe 中。查看更新的答案
    猜你喜欢
    • 2015-11-12
    • 2017-07-13
    • 2012-09-16
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多