alo*_*ord 5 python selenium web-scraping reactjs webdriverwait
我在抓取一个使用的网站时遇到一些困难react.js,但不确定为什么会发生这种情况。
我想做的是单击带有 的按钮class: play-pause-button btn btn -naked。但是,当我使用 Mozilla gecko webdriver 加载页面时,会抛出异常
Message: Unable to locate element: .play-pause-button btn btn-naked
Run Code Online (Sandbox Code Playgroud)
这让我觉得也许我应该做点别的事情来获得这个元素?到目前为止,这是我的代码:
driver.get("https://drawittoknowit.com/course/neurological-system/anatomy/peripheral-nervous-system/1332/brachial-plexus---essentials")
# execute script to scroll down the page
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return lenOfPage;")
time.sleep(10)
soup = BeautifulSoup(driver.page_source, 'lxml')
print(driver.page_source)
play_button = driver.find_element_by_class_name("play-pause-button btn btn-naked").click()
print(play_button)
Run Code Online (Sandbox Code Playgroud)
有谁知道我该如何解决这个问题?任何帮助深表感谢
看来你很接近。使用时find_element_by_class_name(),您不能传递多个类,并且只能传递一个classname,即只能传递以下任一类中的一个:
play-pause-buttonbtnbtn-naked在传递多个类时,find_element_by_class_name()您将面临消息:无效的选择器:不允许复合类名
作为替代方案,由于该元素是Angular元素,因此您click()必须在该元素上引发WebDriverWaitelement_to_be_clickable(),并且可以使用以下任一定位器策略:
使用CSS_SELECTOR:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.play-pause-button.btn.btn-naked")))click()
Run Code Online (Sandbox Code Playgroud)使用XPATH:
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='play-pause-button btn btn-naked']")))click()
Run Code Online (Sandbox Code Playgroud)注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
8969 次 |
| 最近记录: |