【问题标题】:How do I iterate through each google search page using Selenium Python,but its not happening我如何使用 Selenium Python 遍历每个谷歌搜索页面,但它没有发生
【发布时间】:2019-01-04 08:19:06
【问题描述】:

我正在尝试遍历每个页面,但下面的代码对我不起作用。

pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
print len(pages)
counter=1
for page in pages:
     counter+=1
     page.click()

【问题讨论】:

  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅How to Ask 页面以获得澄清此问题的帮助。
  • 它经历了多少次迭代?从1切换到2是否成功?也请您在这里分享错误响应

标签: python selenium testing selenium-webdriver automation


【解决方案1】:

你的代码只会在第一次成功运行,也就是它会点击第二页,然后它会在这一行抛出一个Stale Element Reference Exception -

page.click()

现在,这是为什么呢?这是因为page WebElement 只不过是您单击一次之前识别的元素列表pages 的成员。由于单击分页按钮一次后,DOM 发生了 更改 ,因此对您之前定位的元素的引用不再有意义。

要解决这个问题,您需要在每次 DOM 更改时(即每次单击分页按钮时)一次又一次地不断寻找分页按钮。一个简单的解决方案是使用您的 counter 变量来遍历您的列表。这是完整的代码-

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

driver = webdriver.Chrome(executable_path=r'//path to driver')
driver.get("google url")
driver.find_element_by_id("lst-ib").send_keys("search")
driver.find_element_by_id("lst-ib").send_keys(Keys.ENTER)
driver.maximize_window()
pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
counter=1
for page in pages:
     pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
     counter+=1
     pages[counter].click()

另一种(更好的)解决方案是通过文本识别分页按钮 -

pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
counter=2  #starting from 2
for page in pages:
     driver.find_element_by_xpath("//a[text() = '" + str(counter) + "']").click()
     counter+=1

您也可以尝试按“下一步”按钮:

pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
counter=2  #starting from 2
for page in pages:
     driver.find_element_by_xpath("//span[text()='Next']").click()
     counter+=1

编辑 -

我修复了你的最终代码。我重命名了一些变量,以免您感到困惑,并将您的隐式等待替换为 explicit waits

import unittest
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time

class GoogleEveryFirstLink(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Chrome(executable_path=r'D:\Test automation\chromedriver.exe')
        self.driver.get("http://www.google.com")

    def test_Hover_Facebook(self):
        driver = self.driver
        self.assertIn("Google",driver.title)
        elem=driver.find_element_by_id("lst-ib")
        elem.clear()
        elem.send_keys("India")
        elem.send_keys(Keys.RETURN)
        page_counter=2
        links_counter=1
        wait = WebDriverWait(driver,20)
        wait.until(EC.element_to_be_clickable((By.XPATH,"(//h3[@class='r']/a)[" + str(links_counter) + "]")))
        pages=driver.find_elements_by_xpath("//*[@id='nav']/tbody/tr/td/a")
        elem1=driver.find_elements_by_xpath("//h3[@class='r']/a")
        print len(elem1)
        print len(pages)
        driver.maximize_window()
        for page in pages:
            for e in elem1:
                my_link = driver.find_element_by_xpath("(//h3[@class='r']/a)[" + str(links_counter) + "]")
                print my_link.text
                my_link.click()
                driver.back()
                links_counter+=1
            my_page = driver.find_element_by_xpath("//a[text() = '" + str(page_counter) + "']")
            my_page.click()
            page_counter+=1

    def tearDown(self):
        self.driver.close()

if __name__=="__main__":
    unittest.main()

【讨论】:

  • ,我试图每次点击我正在尝试的谷歌每个页面的第一个超链接。即使我通过做一些修改来尝试你的,但它不起作用..
  • @Muddesir 我发布的第一个代码非常适合我。请注意,您必须手动添加驱动程序路径和 google URL。除此之外你做了什么修改?告诉我你运行的确切代码。
  • 再次,您在“e.click()”处犯了同样的错误,“e”是您在单击第一个链接之前找到的 elem1 列表的成员,因此它会抛出陈旧元素引用执行。您应该遵循与页面类似的方法。
  • 它总是在第二次中断,我注意到的一件事是,对于分页,它像 4,7,9,11 一样随机点击,然后继续。请告诉我为什么它不起作用。
  • @Muddesir 检查我的最终答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-09
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
相关资源
最近更新 更多