【问题标题】:Selium Unable to Locate Class ElementSelenium 无法找到类元素
【发布时间】:2020-11-16 08:50:41
【问题描述】:

亲爱的 Stackoverflowers,

我正在尝试自动化 CC 支付流程,但 Selenium 很难识别我想要点击的特定元素。我正在尝试点击“REI Card - 6137”,以便继续进入付款页面。使用检查工具,它将类显示为“soloLink accountNamesize”。不幸的是,没有我可以追踪的 ID。当我尝试按类名搜索时,我在控制台中收到此错误:

selenium.common.exceptions.NoSuchElementException:消息:无法 定位元素:.soloLink accountNamesize

下面是网站的图片和检查器窗格,其中我尝试单击的内容以蓝色突出显示。由于它是我的信用卡并且我已经记录了它,因此该页面的链接不会真正帮助你们。

脚本挂断在“driver.find_element_by_class_name('soloLink accountNamesize').click()”上

我的代码如下:

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

import yaml
import time
conf = yaml.load(open(r'D:\Users\Matt\Documents\GitHub\YML_Files\REI_Login_Credentials.yml'))
myREIUsername = conf['REILogin']['username']
myREIPassword = conf['REILogin']['password']

driver = webdriver.Firefox(
    executable_path=
    r'D:\Users\Matt\Documents\GitHub\Executable_Files\geckodriver.exe'
)

def login():
   driver.get('https://onlinebanking.usbank.com/Auth/Login?usertype=REIMC&redirect=login&lang=en&exp=')
   time.sleep(4)
   driver.find_element_by_id('aw-personal-id').send_keys(myREIUsername)
   driver.find_element_by_id('aw-password').send_keys(myREIPassword)
   time.sleep(2)
   driver.find_element_by_id('aw-log-in').click()
   time.sleep(15)
   make_payment()

def make_payment():
    if (driver.find_element_by_class_name("accountRowLast").text) != "0.00":
        driver.find_element_by_class_name('soloLink accountNamesize').click()


    else:
        driver.quit()

我尝试通过 Xpath 和 Xpath + Class 进行搜索,但没有成功。我也尝试搜索这个问题,但它是一个相当独特的课程,所以我没有太多运气。有什么我可以尝试的其他想法吗?

【问题讨论】:

  • 使用 webdriver 等待而不是 time.sleep。

标签: python selenium automation


【解决方案1】:

soloLink accountNamesize 是多个类名,使用以下 css 选择器代替点击该元素。

driver.find_element_by_css_selector('a.soloLink.accountNamesize').click()

为了诱导等待

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.soloLink.accountNamesize"))).click()

【讨论】:

  • 成功了!我之前尝试过使用 CSS 选择器,但是当我点击“通过 CSS 选择器复制”并将其粘贴到我的代码中时,它只通过了“.accountNamesize”。我不知道你必须在它前面添加“a.soloLink”。你怎么知道的?
  • .accountNamesize 只会得到一个单一名称的类,它是一个复合类,有多个类名,所以你需要它们。
  • 太棒了。谢谢。你怎么知道不止一堂课?
  • 多个类名中往往会有空格。
  • 还可以尝试在代码中使用等待以使其更稳定。并接受答案。
【解决方案2】:

根据照片,我认为这是您可能想要的xpath

//div[@id='MyAccountsDiv']//div[@id='CreditsTableDiv']//tbody//tr[@class='accountRowFirst']//a[contains(@onclick, 'OpenAccountDashboard')]

如您所见,此 xpath 以可能是唯一的最顶层 div ( MyAccountsDiv ) 开始,然后继续深入到 HTML 代码。

基于此,您可以点击以下代码的链接

xpath = "//div[@id='MyAccountsDiv']//div[@id='CreditsTableDiv']//tbody//tr[@class='accountRowFirst']//a[contains(@onclick, 'OpenAccountDashboard')]"
driver.find_element(By.XPATH, xpath).click()

注意
你的错误说

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="aw-personal-id"]

也许您可以使用上述技术,看看是否可以将xpath 隔离为网络元素。

【讨论】:

  • 我在原帖中完全发布了错误的错误,如果我给您带来任何困惑,请见谅。正如 arundeep chohan 提到的,我不得不使用 CSS 选择器和其他一些我不知道您必须添加的缺失词。不过,我感谢您的所有努力!
  • @Hiebs915 - 没问题
猜你喜欢
  • 2020-03-05
  • 2015-03-06
  • 2018-03-31
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 2019-12-19
相关资源
最近更新 更多