python 自动化不遍历链接列表,但没有抛出错误

cyvaqqii  于 2023-05-16  发布在  Python
关注(0)|答案(3)|浏览(99)

我正在用selenium和python创建一个自动化测试,并试图让它点击页面上的每个产品。我想遵循的步骤是:
1.去亚马逊网站。
1.点击搜索栏。
1.在搜索栏中键入“3D打印机”。
1.单击提交按钮。
1.点击第一个搜索结果。
1.等待10秒钟。
1.返回到搜索结果。
1.点击第二个搜索结果。
1.等等等等
到目前为止,我的代码如下所示

# Navigate to the main product page
driver.get('https://www.amazon.com/')

# Find Search Bar and enter product to search for
driver.find_element(By.ID, 'twotabsearchtextbox').send_keys('3D Printers')

#Find and click Submit button
driver.find_element(By.ID, "nav-search-submit-button").click()

# Find all the product links on the page
product_links = driver.find_elements(By.XPATH, "div[@data-component-type='s-search-result']//a[@class='a-link-normal']")

# Iterate over each product link
for link in product_links:
    print('link', link.text)

    # Click on the product link to go to the product page
    link.click()

    driver.implicitly_wait(10)

    # Go back to the main product page
    driver.back()

    # Wait for the page to load before finding the next link
    driver.implicitly_wait(10)

driver.quit()

当我运行测试时,没有一个链接被点击,但在测试完成后我没有得到任何错误。我尝试添加一个print()方法,看看是否可以打印链接中的文本,但在控制台中也看不到任何内容。有人知道我做错了什么吗?

bejyjqdl

bejyjqdl1#

我修改了你的xpath,因为它总是找到零个元素。现在看起来像这样://span[@class = 'a-size-medium a-color-base a-text-normal']
另外,每次调用driver.back()函数时都必须更新列表,否则列表中的项将无效,您将获得异常。我已经通过更新for循环中的列表解决了这个问题。现在应该能用了

# Navigate to the main product page
driver.get('https://www.amazon.com/')

# Find Search Bar and enter product to search for
driver.find_element(By.ID, 'twotabsearchtextbox').send_keys('3D Printers')

#Find and click Submit button
driver.find_element(By.ID, "nav-search-submit-button").click()

# Find all the product links on the page
product_links = driver.find_elements(By.XPATH, "//span[@class = 'a-size-medium a-color-base a-text-normal']")

print(f"Found {len(product_links)} pages")

# Iterate over each product link
for i, _ in enumerate(product_links):
    print('link', product_links[i].text)

    # Click on the product link to go to the product page
    product_links[i].click()

    driver.implicitly_wait(10)

    # Go back to the main product page
    driver.back()
    
    #update the list
    product_links = driver.find_elements(By.XPATH, "//span[@class = 'a-size-medium a-color-base a-text-normal']")

    # Wait for the page to load before finding the next link
    driver.implicitly_wait(5)

driver.quit()
ej83mcc0

ej83mcc02#

也许你不需要所有的代码?您只需将搜索查询作为参数添加到URL中,即可直接访问搜索结果。例如,您可以使用Selenium的Browserist扩展来获取并单击元素。就像这样:

from browserist import Browser

search_query = "3D Printers"

with Browser() as browser:
    browser.open.url(f"https://www.amazon.com/s?k={search_query.replace(' ', '+')}")

    product_links = browser.get.attribute.values("//a[@class='a-link-normal']", "href")

    for link in product_links:
        browser.open.url(link)

在充分披露,我是作者的Browserist包。Browserist是Selenium Web驱动程序的轻量级、不太冗长的扩展,使浏览器自动化更加容易。只需使用pip install browserist安装软件包即可。
备注:

  • https://www.amazon.com/s?k=keywords是默认的搜索查询URL。
  • 与单击元素相比,在列表中提取产品链接URL更健壮。这就是browser.get.attribute.values("//a[@class='a-link-normal']", "href")部分通过定位相关的<a>...</a>标记并获取它们的href链接值所做的。
  • Browserist不需要像WebDriverWaitimplicitly_waitexpected_conditions或类似的显式条件-它已经内置了,所以你不必担心它。相反,Browserist在与元素交互之前等待元素完全加载。更多关于这个概念在这里。

这就是我得到的我希望这是有帮助的。如果你有问题就告诉我?

a0x5cqrl

a0x5cqrl3#

使用Selenium的Browserist扩展的另一个变体:

from browserist import Browser

products_xpath = "//span[@class = 'a-size-medium a-color-base a-text-normal']"

with Browser() as browser:
    browser.open.url("https://www.amazon.com/")
    browser.input.value("//input[@id='twotabsearchtextbox']", "3D Printers")
    browser.click.button("//input[@id='nav-search-submit-button']")

    products_count = browser.tool.count_elements(products_xpath)

    for i in range(1, products_count + 1):
        product_xpath = f"({products_xpath})[{i}]"
        browser.scroll.into_view(product_xpath)
        product_text = browser.get.text(product_xpath)
        print(f"Product {i} of {products_count}: {product_text}")
        browser.click.button(product_xpath)
        browser.back()

备注:

  • 您需要将元素滚动到视图中,然后才能与它们进行交互,例如单击。
  • Browserist不需要像implicitly_wait那样的显式条件-它已经内置了,所以您不必担心它。

这就是我得到的我希望这是有帮助的。如果你有问题就告诉我?

相关问题