【问题标题】:Why selenium is unable to locate the Disqus comment section?为什么 selenium 无法找到 Disqus 评论部分?
【发布时间】:2018-09-30 06:26:12
【问题描述】:

你好

我之前在 python 上创建了一些 selenium 脚本,它们运行良好,但不知道为什么它不能在网站上运行。 我正在尝试单击在该网站上加载“DISQUS”时出现的元素。 Disqus 是网站加载后加载的评论部分。

所以我使用了 sleep 方法但它不起作用,所以我尝试使用 python IDLE 来逐行执行代码,这样我就可以在 Disqus 注释部分完全可用但仍然可以运行定位代码得到同样的错误。 “Webdriver 无法定位元素”

这是我的代码。

import selenium
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
browser = webdriver.Chrome('E:\\ChromeDriver\\chromedriver_win32\\chromedriver.exe')
browser.get('https://www.eloanus.com/customers-review')	
dicuss = browser.find_element_by_class_name('textarea')
print(dicuss)

错误,我知道了。

Traceback (most recent call last):
  File "C:\Users\Acer-573G\PycharmProjects\Appium\venv\import selenium.py", line 12, in <module>
    dicuss = browser.find_element_by_class_name('textarea')
  File "C:\python3.5\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 563, in find_element_by_class_name
    return self.find_element(by=By.CLASS_NAME, value=name)
  File "C:\python3.5\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 966, in find_element
    'value': value})['value']
  File "C:\python3.5\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
    self.error_handler.check_response(response)
  File "C:\python3.5\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"class name","selector":"textarea"}
  (Session info: chrome=69.0.3497.100)
  (Driver info: chromedriver=2.41.578737 (49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.17134 x86_64)

我附上了来自该网站的检查元素(类)的屏幕截图。

Inspect element screen shot

我是编程新手,如有任何帮助,将不胜感激。

【问题讨论】:

标签: python selenium iframe disqus webdriverwait


【解决方案1】:

有多个 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(executable_path = r'D:/Automation/chromedriver.exe')
driver.maximize_window()
driver.get("https://www.eloanus.com/customers-review")

wait = WebDriverWait(driver, 20)

visibilty_login = wait.until(EC.visibility_of_element_located((By.XPATH, "//span[text()='Log In']")))

action = ActionChains(driver)

wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[id$='disqusCommentsHolder']")))

wait.until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[title='Disqus']")))

driver.execute_script("window.scrollTo(0, 100)") 

wait.until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Join the discussion…']/following-sibling::div[@class='textarea']"))).send_keys("Hi")

driver.switch_to.default_content()  

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    要将字符序列发送到Disqus评论部分,您需要:

    • 诱导 WebDriverWait 使所需的父 框架可用并切换到它
    • 诱导 WebDriverWait 使所需的嵌套 框架可用并切换到它
    • 诱导 WebDriverWait 使所需的元素可点击,您可以使用以下解决方案:
    • 代码块:

      from selenium import webdriver
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      options = webdriver.ChromeOptions() 
      options.add_argument("start-maximized")
      options.add_argument('disable-infobars')
      browser=webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
      browser.get('https://www.eloanus.com/customers-review') 
      WebDriverWait(browser, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='disq2disqusCommentsHolder']")))
      WebDriverWait(browser, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@id,'dsq-app') and @title='Disqus']")))
      WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='textarea'][contains(@aria-label,'Join the discussion')]"))).send_keys("Michael Berger")
      
    • 浏览器快照:

    【讨论】:

      猜你喜欢
      • 2016-08-04
      • 1970-01-01
      • 2011-08-16
      • 1970-01-01
      • 2012-06-23
      • 2014-01-03
      • 2013-12-12
      • 2014-03-28
      • 1970-01-01
      相关资源
      最近更新 更多