Selenium 无法将键发送到组合框元素

问题描述 投票:0回答:1

我一直在尝试使用 Selenium 创建一种向谷歌财经添加股票的自动化方法。我可以登录并添加新投资,但这就是我陷入困境的地方。

重现步骤:

在谷歌财经中创建一个新的投资组合。在投资组合中填充至少 1 项。接下来,当您运行如下脚本时,它会单击“投资”,但无法将任何股票名称发送到组合框。

代码:

class Google:
    def __init__(self) -> None:
        self.url = "https://accounts.google.com"
        self.driver = uc.Chrome()
        self.driver.delete_all_cookies()
        self.time = 60
    
    def login_and_goto_google_finance(self, email, password):
        self.driver.get(self.url)
        WebDriverWait(self.driver, 20) \
            .until(EC.visibility_of_element_located((By.NAME, 'identifier'))) \
            .send_keys(f'{email}' + Keys.ENTER)
        WebDriverWait(self.driver, 20) \
            .until(EC.visibility_of_element_located((By.NAME, 'Passwd'))) \
            .send_keys(f'{password}' + Keys.ENTER)
        
    def navigate_to_site(self, url, wait_enabled=True):
        if wait_enabled:
            sleep(self.time/20)
        self.driver.get(url)
        self.driver.find_element(By.XPATH, '//span[text()="Investment"]').click()
        self.enter_symbol("BP", 1, 20240201, 100)
        sleep(60*self.time)
        
        
    def enter_symbol(self, symbol_name, qty, date, price):
        try:
            x = self.driver.find_element(By.XPATH, "//*[contains(@class, 'Ax4B8 ZAGvjd')]")
            print(x.aria_role)
            sleep(1)
            x.click()
            sleep(1)
            x.send_keys(f'{symbol_name}'+Keys.ENTER)
        except:
            pass
        finally:
            sleep(60*self.time)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-u", "--username", type=str, help="Email Id for logging in to Google", required=True)
    parser.add_argument("-p", "--password", type=str, help="Password for logging in to Google", required=True)
    args = parser.parse_args()
    
    google = Google()
    google.login_and_goto_google_finance(args.username, args.password)
    google.navigate_to_site(<link_to_your_portfolio_here>)

我在这里做错了什么,正确的处理方法应该是什么?

python selenium-webdriver google-finance
1个回答
0
投票

定位器

"//*[contains(@class, 'Ax4B8 ZAGvjd')]"
适合两个元件。
find_element
返回 DOM 中的第一个元素,但您想要将数据发送到第二个元素,因此您需要使用祖先元素来使用更具体的定位器

self.driver.find_element(By.XPATH, '//div[@class="M52nVb ytPNkd"]//input[@class="Ax4B8 ZAGvjd"]')
© www.soinside.com 2019 - 2024. All rights reserved.