Поиск идентификаторов из текстового файла с помощью python + selenium + webdriver и запись в URL-адрес файла - PullRequest
0 голосов
/ 07 июня 2019

Что я пытаюсь сделать открыть URL, прочитать текстовый файл взять идентификатор продукта из файла один за другим, введите это в поле ввода поиска на веб-странице, нажмите на кнопку поиска, узнать все доступные ссылки поставщиков на странице, открыть ссылки всех поставщиков в новых вкладках, запишите эти URL в файл.

Что я пробовал:

import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver

from selenium.webdriver.chrome.options import Options
options = webdriver.ChromeOptions()
options.add_argument('--incognito')
options.add_argument("user-data-dir=d:\\abprofile")
driver = webdriver.Chrome(chrome_options=options, executable_path='C:\chromedriver_win32\chromedriver.exe')
driver.implicitly_wait(30)
driver.maximize_window()
driver.get("https://xxxxxx/products")
elem = driver.find_element_by_xpath("//input[@id='search']")
main_window = driver.current_window_handle
with open('d:/ids.txt') as in_file:
    for ids in in_file:
        elem.send_keys(ids)
        driver.switch_to.window(main_window)
        elem = driver.find_element_by_xpath("//button[contains(@id,'search')]").click()
addr = len(driver.find_elements_by_xpath("(//a[contains(.,'Available Vendors')])"))
for addrNum in range(addr):

    ele = driver.find_element_by_xpath("(//a[contains(.,'Available Vendors')])[" + str(addrNum + 1) + "]")
    href = ele.get_attribute('href')

    driver.execute_script("window.open('" + href + "');")
    time.sleep(4)
for handle in driver.window_handles:
    if handle != main_window:
        print(handle)
        page = handle
        driver.switch_to.window(page)
        time.sleep(7)
        element = driver.find_element_by_xpath("//a[contains(.,'Verfiy quotes')]").click()
        print(driver.current_url)
        urls = driver.current_url
        print (urls)
        with open('d:/somefile.txt', 'a') as the_file:
            the_file.write(urls+"\n")
driver.switch_to.window(main_window)

Но он не работает, когда я отправляю идентификаторы из файла, говорящие

 no such element: Unable to locate element: 
 {"method":"xpath","selector":"//button[contains(@id,'search')]"}

Но когда я жестко кодирую только один идентификатор продукта, как показано ниже, тогда он работает

рабочий:

elem.send_keys("34564545666")

Не работает:

with open('d:/ids.txt') as in_file: for ids in in_file: elem.send_keys(ids) driver.switch_to.window(main_window) elem = driver.find_element_by_xpath("//button[contains(@id,'search')]").click()

любое предложение, что не так ...

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Когда вы читаете файл с помощью open (), он имеет символ \ n (символ новой строки) в конце.

with open('d:/ids.txt') as in_file:
    for ids in in_file:
        elem.send_keys(ids)
        driver.switch_to.window(main_window)
        elem = driver.find_element_by_xpath("//button[contains(@id,'search')]").click()

print (ids) напечатает: "34564545666 \ n", не "34564545666"

Вы должны использовать строку без символа \ n в качестве параметра.

Таким образом, вы можете использовать ids.rstrip () (удаляет пробел в правом конце.) или идентификаторы [: - 1] (без последнего символа. (\ n))

0 голосов
/ 07 июня 2019

Root Cause: Это причина следующей строки в вашем первом цикле for.

elem = driver.find_element_by_xpath("//button[contains(@id,'search')]").click()

Здесь вы перезаписываете элемент кнопкой и пытаетесь отправить ключи. Измените вышеприведенную строку на 'driver.find_element_by_xpath ("// кнопка [содержит (@ id,' поиск ')]"). Click () `

Также вы можете сделать ниже.

# assign elem in the first for loop
for ids in in_file:
    editElem = driver.find_element_by_xpath("//input[@id='search']")
    editElem.send_keys(ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...