【问题标题】:Python - Selenium going through arrayPython - Selenium 遍历数组
【发布时间】:2018-09-20 13:55:36
【问题描述】:

我想做自动化脚本。我在程序开始时定义了一个数组。 稍后的程序正在打开浏览器并在谷歌中搜索一些特定的单词(例如苹果),下一个程序是单击数组中的第一个字符串并关闭浏览器。后来做同样的事情,但它会从数组中点击第二个单词。 我的代码:

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


driver = webdriver.Chrome("C:/Users/Daniel/Desktop/chromedriver.exe")
driver.implicitly_wait(30)
driver.maximize_window()




hasla = ["ispot","myapple"]

for slogan in hasla:
    driver.get("http://www.google.com")
    search_field = driver.find_element_by_id("lst-ib")

    search_field.clear()
    search_field.send_keys("apple")
    search_field.submit()
    name = driver.find_element_by_link_text(slogan)
    name.click()
    driver.quit()
    driver.implicitly_wait(10)

当我从 Windows 中的控制台启动该程序时。 程序正在打开浏览器,在 ispot 和 clsoe 浏览器中寻找苹果点击,但它没有打开新的浏览器,并且它对数组中的下一个字符串做同样的事情。有什么解决办法吗?

在控制台我有这个: screen

【问题讨论】:

  • 你的问题到底是什么?
  • 当我从 Windows 中的控制台启动这个程序时,程序正在打开浏览器,在 ispot 中寻找苹果点击并关闭浏览器,但它没有打开新的浏览器,并且它对数组中的下一个字符串不做同样的事情。有什么解决办法吗?
  • 您在短时间内从同一 IP 地址发送了太多请求。 Apple 拒绝您的连接(根据您附加的图片判断)。尝试实现 time.sleep(5) 以在下一个请求前等待 5 秒。
  • 欢迎来到 Stackoverflow。请编辑您的问题以澄清您的问题描述。这也将帮助与您有相同问题的未来用户。如需指导,请阅读how to ask questions 和how to create a minimal example

标签: python selenium automation


【解决方案1】:

您正在 for 循环中退出浏览器,因此第二次迭代无法执行任何操作,因为没有打开浏览器。如果您每次都需要重新开始,您可以尝试打开一个新标签并关闭旧标签。试试这个:

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

driver = webdriver.Chrome("C:/Users/Daniel/Desktop/chromedriver.exe")
driver.implicitly_wait(30)
driver.maximize_window()

hasla = ["ispot","myapple"]

for slogan in hasla:
    driver.get("http://www.google.com")
    search_field = driver.find_element_by_id("lst-ib")

    search_field.clear()
    search_field.send_keys("apple")
    search_field.submit()
    name = driver.find_element_by_link_text(slogan)
    name.click()

    # Save the current tab id
    old_handle = driver.current_window_handle

    # Execute JavaScript to open a new tab and save its id
    driver.execute_script("window.open('');")
    new_handle = driver.window_handles[-1]

    # Switch to the old tab and close it
    driver.switch_to.window(old_handle)
    driver.close()

    # Switch focus to the new tab
    driver.switch_to.window(new_handle)

如果您关闭选项卡,您将无法看到结果。您可能希望保持打开状态,然后转到新选项卡。在这种情况下,只需删除 driver.close()。

或者,如果您真的想每次都完全关闭浏览器并重新打开它,您只需在 for 循环中包含前三行即可。

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

hasla = ["ispot","myapple"]

for slogan in hasla:
    driver = webdriver.Chrome("C:/Users/Daniel/Desktop/chromedriver.exe")
    driver.implicitly_wait(30)
    driver.maximize_window()

    driver.get("http://www.google.com")
    search_field = driver.find_element_by_id("lst-ib")

    search_field.clear()
    search_field.send_keys("apple")
    search_field.submit()
    name = driver.find_element_by_link_text(slogan)
    name.click()
    driver.quit()

回答你的第二个问题:

首先,导入 NoSuchElementException:

from selenium.common.exceptions import NoSuchElementException

然后将您的 try/except 替换为:

    try:
        name = driver.find_element_by_link_text(slogan)
        name.click()
    except NoSuchElementException:
        print('No such element')
    driver.quit()

如果找到或没有找到元素,它仍然会关闭浏览器并进入下一次迭代。

【讨论】:

  • 好的,谢谢,我明白这一点,但我有问题,因为我有错误,如“unindent 与任何外部缩进级别不匹配”,我看不到我在哪里有确切的代码,问题在“NoSuchElementException 除外: ' 我还在 'driver.quit()' 之前放了 tab,但还是不行。
  • 如果您知道错误在哪一行,请将光标放在前一行的末尾,单击删除直到它们成为一行,然后按Enter。大多数 IDE 会自动为您缩进该行。如果您不一致地使用制表符和空格,您可能会收到错误消息。这是官方文档:Indentation,这是一篇有用的文章:Structuring with Indentation。希望这会有所帮助!
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 2015-01-16
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多