如何解决Amazon Ubuntu EC2 Python Selenium Webbrowser Chrome元素突然不再可交互
我成功创建了一个python脚本,该脚本可从图表平台Tradingview下载股票数据。当我从本地计算机启动它时,一切正常。
现在,我想从ubuntu ec2机器和crontab启动脚本。几天前,我首先尝试从ec2机器手动运行脚本。今天,我想尝试设置crontab。它没有用,所以我尝试再次手动启动python脚本。这次我收到此错误。
File "automated_prediction_ec2.py",line 282,in <module>
signin.click()
File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py",line 80,in click
self._execute(Command.CLICK_ELEMENT)
File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webelement.py",line 633,in _execute
return self._parent.execute(command,params)
File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py",line 321,in execute
self.error_handler.check_response(response)
File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py",line 242,in check_response
raise exception_class(message,screen,stacktrace)
selenium.common.exceptions.ElementnotinteractableException: Message: element not interactable
(Session info: headless chrome=86.0.4240.75)
首先我认为可能是Tradingview更改了他们的HTML,所以我尝试从本地计算机运行它。像以前一样完美地工作。
这些是我的ChromeOptions。我已经尝试了几种组合来解决该问题,但这是上次使用的组合。
options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : '/home/ubuntu/daily_stock_data'}
options.add_argument('--headless')
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandBox')
options.add_experimental_option('prefs',prefs)
那有什么问题,有一天我的脚本在ec2机器上运行,然后突然出现此错误? 此外,脚本正在下载130个CSV。 ec2实例是否有下载限制之类的东西?
driver.get("https://www.Tradingview.com/")
driver.implicitly_wait(20)
signin = driver.find_element_by_class_name("tv-header__link.tv-header__link--signin.js-header__signin")
signin.click()
<span class="tv-header__dropdown-text">
<a class="tv-header__link tv-header__link--signin js-header__signin" href="#signin">Sign in</a>
</span>
解决方法
要单击文本为登录的元素,可以使用以下任一Locator Strategies:
-
使用
link_text
:driver.find_element_by_link_text("Sign in").click()
-
使用
css_selector
:driver.find_element_by_css_selector("a.tv-header__link--signin[href='#signin']").click()
-
使用
xpath
:driver.find_element_by_xpath("//a[contains(@class,'tv-header__link--signin') and text()='Sign in']").click()
理想情况下,要单击element_to_be_clickable()
的{{3}}元素,可以使用以下WebDriverWait之一:
-
使用
LINK_TEXT
:WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.LINK_TEXT,"Sign in"))).click()
-
使用
CSS_SELECTOR
:WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"a.tv-header__link--signin[href='#signin']"))).click()
-
使用
XPATH
:WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//a[contains(@class,'tv-header__link--signin') and text()='Sign in']"))).click()
-
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。