当前位置: 首页 > 知识库问答 >
问题:

如何使用EC.presence_of_element_located((By.ID,“myDynamicElement”))指定类而不是ID

曹鹏海
2023-03-14

我正在尝试使用Python来web抓取一个网站,通过使用嵌入式javascript文件动态加载HTML,将数据作为响应呈现到HTML中。因此,如果我单独使用BeautifulSoup,我将无法检索我所需的数据,因为我的程序将在Javascript加载数据之前将其删除。因此,我将selenium库集成到我的代码中,以使我的程序在抓取网站之前等待找到某个元素。

我最初是这样做的:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.ID, "tabla_evolucion")))

但我想指定一个类,而不是执行以下操作:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))  

这是我的代码的其余部分:

driver_path = 'C:/webDrivers/chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.header_overrides = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}
url = "myurlthatIamscraping.com" 
response = driver.get(url)
html = driver.page_source
characters = len(html)
element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))

print(html)
print(characters)
time.sleep(10)
driver.quit()

它对我不起作用,我在任何地方都找不到正确的语法。

共有3个答案

牟飞沉
2023-03-14

我有一个解决方案:尝试一下-将您的classclass更改为class_NAME

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.CLASS_NAME , "ng-binding ng-scope")))
越扬
2023-03-14

相关的HTML将帮助我们构建一个更规范的答案。但是,从第一行代码开始:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located(
  (By.ID, "tabla_evolucion")))

在第二行代码中:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located(
  (By.class, "ng-binding ng-scope")))

将引发错误:

消息:无效的选择器:不允许复合类名

因为您不能通过 By.class 传递多个类。

您可以在无效选择器中找到详细讨论:Webdriver和Python不允许使用find_element_by_class_name的复合类名

您需要注意以下几点:

    < li >在对您的用例没有任何可见性的情况下,在功能上将与EC相关联的WebDriverWait归纳为< code > presence _ of _ element _ located()仅确认DOM树中元素的存在。假设您需要获得属性,例如< code>value、< code>innerText等,或者您将与元素进行交互。因此,您需要使用< code > visibility _ of _ element _ located()或< code > element _ to _ be _ clickable() 来代替< code > presence _ of _ element _ located()

您可以在 Web驱动程序中找到详细的讨论,即未按预期工作

>

  • 为了获得最佳结果,您可以组合IDCLASS属性,并且您可以使用以下任一定位器策略:

    使用< code>CSS_SELECTOR:

      element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located(
        (By.CSS_SELECTOR, ".ng-binding.ng-scope#tabla_evolucion")))
    
    • 使用 XPATH
      element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located(
        (By.XPATH, "//*[@class='ng-binding ng-scope' and @id='tabla_evolucion']")))
    

  • 龙令雪
    2023-03-14

    它位于文档中。

    支持的定位器策略集。' CLASS _ NAME = ' CLASS NAME ' < br > CSS _ SELECTOR = ' CSS SELECTOR ' < br > ID = ' ID ' < br > LINK _ TEXT = ' LINK TEXT ' < br > NAME = ' NAME ' < br > PARTIAL _ LINK _ TEXT = ' PARTIAL LINK TEXT ' < br > TAG _ NAME = ' TAG NAME ' < br > XPATH = ' XPATH '

    注意:代码中的内容不是一个类,而是两个类。如果使用 By.CLASS_NAME() 则此方法不起作用,因为它只需要一个类。取而代之的是一个CSS选择器

    EC.presence_of_element_located((By.CSS_SELECTOR, ".ng-binding.ng-scope")))
    

    在 CSS 选择器语法中,. 表示一个类。有关 CSS 选择器语法的详细信息,请参阅 W3C 文档。

     类似资料:
    • 如何在注释中为web.XML提供注释映射。我已经完成了web.XML.我想尝试使用注释映射,如下所示:

    • 问题内容: 我找到了一篇有用的文章,解释了如何使Jersey使用SLF4J而不是JUL。现在,我的单元测试看起来像(并且很完美): 我的包括以下依赖项: 它运行完美,但是我不想在每个单元测试中都进行相同的配置。这是很明显的代码重复,我想避免。我怎样才能更有效地做到这一点? ps。也许不可能优化上面的代码,而我正在尽力而为? 问题答案: 最好的方法是通过自定义Listener。在JSF servle

    • 我正在迁移到“Linux应用服务”。不幸的是,它不支持WebJobs。在这里,它表示不会。它建议使用Azure函数。 我有一个没有触发器的连续应用程序。它应该一直在运行,就像这样: 我应该如何为这样的应用程序利用Azure功能?

    • 我有一个Java7/Spring3.2.17应用程序,它必须连接到两个不同的数据库,因此我有两个不同的persistence.xml文件,每个文件都声明自己的持久性单元。 在我的DAO类中,我只是让Spring注入实体管理器: Spring抱怨我有两个EM工厂,所以它不知道该用哪一个: NouniqueBeanDefinitionException:未定义[javax.persistence.En

    • 问题内容: 我正在尝试使用Hibernate连接到servlet中的DB。我读到我们可以使用hibernate.cfg.xml或hibernate.properties文件来配置会话。对我来说,它可以与xml一起使用。现在,当我尝试使用属性而不是xml时,它不起作用。据说 没有找到* hibernate.cfg.xml 。但是我没有提到要使用xml文件,事实上我已经删除了该xml文件。 * 请帮我