【问题标题】:Python Selenium-WebDriver - How to Identify this Button/LinkPython Selenium-WebDriver - 如何识别此按钮/链接
【发布时间】:2022-01-28 01:58:24
【问题描述】:

请参考下面的截图和 HTML 代码。有两个按钮/链接名称中包含“Indiana -4.5”和“Indiana”。我正在尝试识别第一个也具有“-4.5”的数字,但是随着它的变化,我不知道该数字是什么。名称“Indiana”后面可以跟一个“+”、“-”,然后再跟一个一位或两位十进制数。

仅将“Indiana”作为变量,我如何选择“Indiana -4.5”而不是“Indiana”链接/按钮。谢谢!

页面链接:https://prolineplus.olg.ca/en-ca/event/?e64240-NBA-Basketball-USA-Indiana-Charlotte

    def proline_go_to_match2(driver, team):
        team = "Indiana"
        print(team)
        try:
            match = WebDriverWait(driver, 15).until(
                EC.presence_of_element_located((By.XPATH, "//*[@title= '" + team +  "']"))
            )
            match.click()
        except:
        driver.quit()

我不知道如何让 Seleium 识别此链接,希望您的帮助!!

这是 HTML 元素

这是第一个链接/按钮:

<span class="fdjgs-outcome-wrapper" aria-pressed="true" role="button" tabindex="0" aria-label="Bet for Charlotte @ Indiana - Indiana -4.5 at 2.10" title="Indiana -4.5"><span class="fdjgs-description">Indiana -4.5</span><span class="fdjgs-price">2.10</span></span>

这是第二个链接/按钮:

<li class="fdjgs-outcome" title="Indiana" data-state="unselected" data-direction="" data-unpriced="false" data-hidden="false" data-resulted="false" data-suspended="false"><span class="fdjgs-outcome-wrapper" aria-pressed="false" role="button" tabindex="0" aria-label="Bet for Charlotte @ Indiana - Indiana at 1.65" title="Indiana"><span class="fdjgs-description">Indiana</span><span class="fdjgs-price">1.65</span></span></li>

【问题讨论】:

  • 您正在寻找子字符串INDIANA,但实际文本包含Indiana。
  • @PaulM。非常感谢!我不敢相信我忽略了这一点,您的解决方案奏效了!祝你有美好的一天。
  • @PaulM。嗨,保罗,通过更改代码确实可以工作,但是它正在选择我不打算选择的按钮/链接。我已经更新了我的问题,你可以看看吗?
  • @jwalman 你能分享一个指向那个页面的链接或者至少是它的 HTML 吗?为了创建正确的定位器,我们需要查看整个页面,而不仅仅是那里的单个元素
  • @Prophet 您好,感谢您的关注!我已添加到页面的链接。我还更新了代码。显示的内容将单击第二个“Indiana”框,而不是“Indiana -4.5”

标签: python selenium selenium-webdriver web-scraping selenium-chromedriver


【解决方案1】:

要点击元素 Indiana -4.5 而不是presence_of_element_located(),您需要为element_to_be_clickable() 诱导WebDriverWait,您可以使用以下Locator Strategy:

  • 使用XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//ul[@class='fdjgs-markets']/li[@class='fdjgs-market']//ul[@class='fdjgs-outcomes']//descendant::li[2]//span[@class='fdjgs-outcome-wrapper' and contains(@aria-label, 'Indiana')]/span[starts-with(., 'Indiana')]"))).click()
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • 浏览器快照:

【讨论】:

  • 感谢您的帮助!但是我的问题是我将使用的唯一变量是“Indiana”,我想选择链接/按钮“Indiana -4.5”但是我的代码当前正在选择不同的按钮/链接。请注意“-4.5”是未知的。它可以是“+”或“-”,后跟一些一位或两位十进制数。
  • @jwalman 查看更新的答案并让我知道状态。
  • 谢谢!!看起来这样行得通。如何用变量 team 替换代码中的“Indiana”?
  • @jwalman 看起来不应该,而是应该 ;) 代码经过良好测试
  • @jwalman 你能根据你的新要求提出一个新问题吗?
【解决方案2】:

您应该使用visibility_of_element_located 而不是presence_of_element_located。
使用正确的定位器,您的代码可以如下:

def proline_go_to_match2(driver, team):
    team = "Indiana"
    print(team)
    try:
        match = WebDriverWait(driver, 15).until(EC.visibility_of_element_located((By.XPATH, "//header[.//span[text()='Point Spread'] and .//span[contains(.,'Match')]]/..//li[contains(@title,'" + team +  "')]"))            )
        match.click()
    except:
       driver.quit()

【讨论】:

  • 感谢您的回复!您能否帮助理解可见性和存在之间的区别以及为什么我应该使用存在代替?非常感谢!
  • 顾名思义,presence_of_element_located 等待页面上出现此类元素。在页面上完成元素渲染需要一些时间。因此,在渲染的早期阶段,该元素将已经存在于页面上,但它可能仍然不可点击,仍然不包含其文本,它可能不在页面上的最终位置等。但是当元素正常可见时表示元素已完成,它包含文本,可以点击等。
  • 所以我们应该总是更喜欢使用visibility_of_element_located,直到我们知道该元素不可见但由于某种原因我们仍然需要等待它的存在。例如,如果此元素不在可见的屏幕视图中。
  • 嘿,有什么办法可以添加一个条件来仅查看屏幕上显示且当前可见的元素?您发送的代码似乎只在部分时间有效。有时它会点击页面底部的错误按钮,这是我不希望发生的。
  • 我不确定这是否能正常工作,因为 Selenium 定义的元素可见性并不总是与人类的含义相同。元素可能被其他元素覆盖或不在实际屏幕视图中,但它仍然可以被 Selenium 识别为可见。我认为我们必须更准确地定义定位器或使输出代码的逻辑更精确,以实现您在这里所需要的。
猜你喜欢
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2019-09-21
  • 2019-09-22
  • 2016-12-03
  • 2023-04-06
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多