脚本找不到元素,但控制台可以 [Selenium] [Python]

2024-10-03 17:22:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写脚本来自动下载instagram故事,但在尝试登录时已经失败了。你知道吗

我正在Pycharm中编写代码。我只是试着用我通常的方法来解决任何问题。首先,通过在控制台中键入命令来解决这个问题,如果可以的话,将控制台中的命令写在脚本中。但问题是。在python控制台中运行良好的函数在脚本中失败。你知道吗

我注意到我的selenium已经过时了,但是升级它并没有帮助。我还做了一个新的项目来测试天气,它没有改变

我还尝试跳过脚本中的第一步,只打开重定向到的url。但是第二个命令也失败了。你知道吗

当我创建一个新变量来存储driver.find_element_by_link_text()的输出时,它返回一个空列表。这让我相信,不知何故selenium无法搜索页面的内容。你知道吗

我也在Chrome和Safari上尝试过同样的方法。这也没用。你知道吗

代码如下:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("https://instagram.com/")
#next command fails
driver.find_element_by_link_text("Melde dich an.").click()

#if the first command is skipped by entering in the url 
#in driver.get(https://www.instagram.com/accounts/login/?source=auth_switcher)
#the following command fails as well.
driver.find_element_by_name("username").send_keys("HereIsTheUsername")
driver.find_element_by_name("password").send_keys("HereIsThePassword")
driver.find_element_by_name("password").send_keys(Keys.RETURN)
driver.close()

在控制台中,这些命令如前所述工作, 以下是我在控制台中输入的内容:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("https://instagram.com/")
driver.find_element_by_link_text("Melde dich an.").click()
#if it failed here would be an error message
element = driver.find_element_by_name("username")

对于脚本,错误消息如下:

Traceback (most recent call last): File "/Users/alisot2000/PycharmProjects/Instagram downloader/venv/Main.py", line 6, in driver.find_element_by_link_text("Melde dich an.").click() File "/Users/alisot2000/PycharmProjects/Instagram downloader/venv/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 428, in find_element_by_link_text return self.find_element(by=By.LINK_TEXT, value=link_text) File "/Users/alisot2000/PycharmProjects/Instagram downloader/venv/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element 'value': value})['value'] File "/Users/alisot2000/PycharmProjects/Instagram downloader/venv/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/Users/alisot2000/PycharmProjects/Instagram downloader/venv/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: Melde dich an.


Tags: textin脚本anbydriverseleniumlink
3条回答

您可能遇到的问题:

1。同步问题

对于大多数自动化任务,根据机器的处理能力和internet连接的强度,网页的加载时间会有所不同。你知道吗

为了解决这个问题,我们可以使用selenium的库导入等待。 下面是一个示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

2。selenium配置文件中设置了错误的语言

Selenium在大多数情况下都会在运行自动化脚本时使用您的语言环境,但是在您可能需要其他语言的情况下,这里是FireFox的示例代码。你知道吗

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

profile = webdriver.FirefoxProfile()
# switch out 'de' with another two character language code
profile.set_preference("intl.accept_languages",'de')
driver = webdriver.Firefox(firefox_profile=profile, executable_path='<insert_your_gecko_driver_path_here>')

driver.get("https://instagram.com/")
driver.close()

三。工作代码(在Mojave 10.14.5上测试)

这是您的代码和修改后的代码的区别:https://www.diffchecker.com/G0WWB4Ry

  1. 设置virtualenv
  2. pip安装
  3. 下载geckodriver
  4. 在代码中设置gecko驱动程序的路径
  5. 使用成功结果运行脚本
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# these two imports are for setting up firefox driver and options 
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
# import these three lines below if you are having synchronization issues
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

profile = webdriver.FirefoxProfile()
# here is where you need to set your language explicitly if its defaulting to an undesired language
# just replace the second parameter with your 2 character language code
# this line is not needed if your desired language is locale
profile.set_preference("intl.accept_languages",'de')
# throw in your path here <insert_your_gecko_driver_path_here>
driver = webdriver.Firefox(firefox_profile=profile, executable_path='<insert_your_gecko_driver_path_here>')

driver.get("https://instagram.com/")

# added these two lines below to solve synchronization issue 
# element wasnt clickable until page finished loading
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.LINK_TEXT, "Melde dich an.")))
#next command fails 
driver.find_element_by_link_text("Melde dich an.").click()

#if the first command is skipped by entering in the url 
#in driver.get(https://www.instagram.com/accounts/login/?source=auth_switcher)
#the following command fails as well.
driver.find_element_by_name("username").send_keys("HereIsTheUsername")
driver.find_element_by_name("password").send_keys("HereIsThePassword")
driver.find_element_by_name("password").send_keys(Keys.RETURN)
driver.close()

你知道吗driver.find\元素\u by\ xpath('//input[@name=“username”]')。发送\u键(“HereIsTheUsername”) driver.find\元素\u by\ xpath('//输入[@name=“password”]')。发送\u密钥(“HereIsTheUsername”) driver.find\元素\u by\ xpath('//div[text()=“登录”]')。单击()

def ClickElementByName(name,driver): 
    while True:
        try:
            driver.find_element_by_name(name).click()
            break
        except:
            sleep(1)
            pass
 Too long to wait the website run.
 Replace ClickElementByName("username", driver)

相关问题 更多 >