如何在jupyterhub页面中使用python-selenium查找现有的HTML元素?

亚历克斯

我在HTML页面中具有以下构造,并且想要选择li元素(使用python-selenium):

<li class="p-Menu-item p-mod-disabled" data-type="command" data-command="notebook:run-all-below">
    <div class="p-Menu-itemIcon"></div>
    <div class="p-Menu-itemLabel" style="">Run Selected Cell and All Below</div>
    <div class="p-Menu-itemShortcut" style=""></div>
    <div class="p-Menu-itemSubmenuIcon"></div>
</li>

我正在使用以下xpath:

//li[@data-command='notebook:run-all-below']

但是似乎找不到该元素。

完整,最少的工作示例代码:

import time
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

driver = webdriver.Firefox()
driver.get("https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/master?urlpath=lab/tree/demo")

# Wait for the page to be loaded
xpath = "//button[@title='Save the notebook contents and create checkpoint']"
element = WebDriverWait(driver, 600).until(
    EC.presence_of_element_located((By.XPATH, xpath))
)
time.sleep(10)
print("Page loaded")

# Find and click on menu "Run"
xpath_run = "//div[text()='Run']"
element = WebDriverWait(driver, 60).until(
    EC.element_to_be_clickable((By.XPATH, xpath_run))
)
element.click()
print("Clicked on 'Run'")

# Find and click on menu entry "Run Selected Cell and All Below"
xpath_runall = "//li[@data-command='notebook:run-all-below']"
element = WebDriverWait(driver, 600).until(
    EC.element_to_be_clickable((By.XPATH, xpath_runall))
)
print("Found element 'Run Selected Cell and All Below'")
element.click()
print("Clicked on 'Run Selected Cell and All Below'")

driver.close()

环境:

  • MacOS Mojave(10.14.6)
  • python 3.8.6
  • 硒3.8.0
  • 壁虎驱动器0.26.0

附录

我一直在尝试使用Firefox“ Selenium IDE”插件记录步骤,该插件为python提供了以下步骤:

sdriver.get("https://hub.gke2.mybinder.org/user/jupyterlab-jupyterlab-demo-y0bp97e4/lab/tree/demo")
driver.set_window_size(1650, 916)
driver.execute_script("window.scrollTo(0,0)")
driver.find_element(By.CSS_SELECTOR, ".lm-mod-active > .lm-MenuBar-itemLabel").click()

当然,这也不起作用。有了这些代码行,我得到一个错误

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: .lm-mod-active > .lm-MenuBar-itemLabel
DebanjanB

你已经足够亲密了。实际上,您的整个程序只有一个问题,如下所示:

  • xpath_runall = "//li[@data-command='notebook:run-all-below']"不与文本识别可见元素运行选定单元与以下全部作为第一个匹配元素是一个独特的隐藏元素。

其他注意事项

其他一些优化:

  • 标识为的元素xpath = "//button[@title='Save the notebook contents and create checkpoint']"可点击元素。因此您可以使用EC代替ECpresence_of_element_located()element_to_be_clickable()

  • 通过EC返回元素后element_to_be_clickable()您可以click()在同一行上调用

  • 用于标识带有文本的元素“运行所选单元格”和“全部在下方”

    //li[@data-command='notebook:run-all-below']//div[@class='lm-Menu-itemLabel p-Menu-itemLabel' and text()='Run Selected Cell and All Below']
    
  • 由于该应用程序是通过JavaScript构建的,因此您需要使用ActionChains


您的优化解决方案将是:

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.action_chains import ActionChains
    
    driver = webdriver.Firefox(executable_path=r'C:\WebDrivers\geckodriver.exe')
    driver.get("https://mybinder.org/v2/gh/jupyterlab/jupyterlab-demo/master?urlpath=lab/tree/demo")
    WebDriverWait(driver, 60).until(EC.element_to_be_clickable((By.XPATH, "//button[@title='Save the notebook contents and create checkpoint']")))
    print("Page loaded")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='Run']"))).click()
    print("Clicked on Run")
    element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//li[@data-command='notebook:run-all-below']//div[@class='lm-Menu-itemLabel p-Menu-itemLabel' and text()='Run Selected Cell and All Below']")))
    ActionChains(driver).move_to_element(element).click(element).perform()
    print("Clicked on Run Selected Cell and All Below")
    
  • 控制台输出:

    Page loaded
    Clicked on Run
    Clicked on Run Selected Cell and All Below
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

无法从python引用现有的QML元素

来自分类Dev

如何在HTML页面中使用数据URL显示图像

来自分类Dev

如何在HTML布局页面中使用多个Java脚本

来自分类Dev

如何扩展现有的自定义元素?

来自分类Dev

如何修改元素中现有的<content>?

来自分类Dev

如何在Eclipse中使用现有的.target文件?

来自分类Dev

如何在python中使用Selenium查找html类中是否存在元素

来自分类Dev

RVest:如何查找HTML页面中使用的所有类?

来自分类Dev

在现有的xml文件python中添加元素

来自分类Dev

如何在Dockerfile中使用现有的Docker Volume

来自分类Dev

如何在Selenium Python中使用JavaScript

来自分类Dev

使用Selenium查找页面元素(Python)

来自分类Dev

如何在Python中使用Selenium从github页面URL抓取贡献者名称

来自分类Dev

Doom如何从现有的正弦查找表中确定其余弦查找表?

来自分类Dev

无法从python引用现有的QML元素

来自分类Dev

如何在Ubuntu中使用Python将HTML页面转换为Pdf?

来自分类Dev

如何使用AWS CDK查找现有的ApiGateway

来自分类Dev

如何使用AWS CDK查找现有的ApiGateway

来自分类Dev

如何使用Selenium从html提取列表,然后在python脚本中使用它来查找元素

来自分类Dev

如何在HTML页面加载中使用JFrames打开Applet

来自分类Dev

使用zen编码片段编辑现有的html

来自分类Dev

如何通过dom元素访问现有的地图对象?

来自分类Dev

如何使用这个现有的JS代码示例基于数据属性查找元素?

来自分类Dev

如何在html中覆盖现有的meta标签?

来自分类Dev

如何在jsp元素中使用页面指令值?

来自分类Dev

如何从现有的HTML模板代码创建Wordpress菜单?

来自分类Dev

selenium 如何从现有的 Web 浏览器页面自动捕获该值并在新会话中使用该值?

来自分类Dev

如何将现有的 html 元素附加到另一个元素?

来自分类Dev

如何在 html 页面中使用 Java for 循环

Related 相关文章

  1. 1

    无法从python引用现有的QML元素

  2. 2

    如何在HTML页面中使用数据URL显示图像

  3. 3

    如何在HTML布局页面中使用多个Java脚本

  4. 4

    如何扩展现有的自定义元素?

  5. 5

    如何修改元素中现有的<content>?

  6. 6

    如何在Eclipse中使用现有的.target文件?

  7. 7

    如何在python中使用Selenium查找html类中是否存在元素

  8. 8

    RVest:如何查找HTML页面中使用的所有类?

  9. 9

    在现有的xml文件python中添加元素

  10. 10

    如何在Dockerfile中使用现有的Docker Volume

  11. 11

    如何在Selenium Python中使用JavaScript

  12. 12

    使用Selenium查找页面元素(Python)

  13. 13

    如何在Python中使用Selenium从github页面URL抓取贡献者名称

  14. 14

    Doom如何从现有的正弦查找表中确定其余弦查找表?

  15. 15

    无法从python引用现有的QML元素

  16. 16

    如何在Ubuntu中使用Python将HTML页面转换为Pdf?

  17. 17

    如何使用AWS CDK查找现有的ApiGateway

  18. 18

    如何使用AWS CDK查找现有的ApiGateway

  19. 19

    如何使用Selenium从html提取列表,然后在python脚本中使用它来查找元素

  20. 20

    如何在HTML页面加载中使用JFrames打开Applet

  21. 21

    使用zen编码片段编辑现有的html

  22. 22

    如何通过dom元素访问现有的地图对象?

  23. 23

    如何使用这个现有的JS代码示例基于数据属性查找元素?

  24. 24

    如何在html中覆盖现有的meta标签?

  25. 25

    如何在jsp元素中使用页面指令值?

  26. 26

    如何从现有的HTML模板代码创建Wordpress菜单?

  27. 27

    selenium 如何从现有的 Web 浏览器页面自动捕获该值并在新会话中使用该值?

  28. 28

    如何将现有的 html 元素附加到另一个元素?

  29. 29

    如何在 html 页面中使用 Java for 循环

热门标签

归档