как я могу щелкнуть ссылку, открыть ее на новой вкладке, выполнить какое-либо действие и вернуться в родительское окно для операций rest в selenium

#python #selenium

#python #selenium

Вопрос:

Я пытаюсь очистить «https://beta.sam.gov/search ?ключевые слова =amp;sort=-ModifiedDateamp;index=oppamp;is_active=trueamp;page = 1 «. сначала я пытаюсь найти все подразделения, в которых есть сведения о возможностях. (Я закончил с этим) Я получаю некоторую базовую информацию с этой страницы, например, даты и названия возможностей. но мне также нужно получить полное описание, для этого я должен нажать на его заголовок, который приведет нас на новую страницу. Я должен получить подробное описание с этой новой страницы и вернуться на родительскую страницу, чтобы использовать следующие возможности.

как я могу это сделать? ниже приведен мой код, который я пробовал, но не смог получить ожидаемый результат.

 from selenium import webdriver
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1200")
driver = webdriver.Chrome(ChromeDriverManager().install())
driver = webdriver.Chrome( options=options ,executable_path="D:/chromedriver.exe")

baseLink = "https://beta.sam.gov"
lastPageNumber = 2
currentpage = 1

# getting source code of each parent page , like page = 1,2,3 until the last page.
def startscrapping(currentpage):
    driver.get(f'https://beta.sam.gov/search?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page={currentpage}')
    source = driver.page_source
    soup = BeautifulSoup(source, 'lxml')
    return soup

# getting the last index for the parent page to be scrapped
def findLastPageIndex():
    soup = startscrapping(1)
    results = soup.find("ul", {"aria-label" : "pagination"}).findAll('li',"ng-star-inserted")
    if results is not None:
        lastPageNumber= int(results[-2].text.strip())

findLastPageIndex()


while  currentpage <= lastPageNumber :
    soup = startscrapping(currentpage)
    outerDivs = soup.find_all(attrs={"tabindex": "-1" , "class": "ng-tns-c1-1 ng-star-inserted"})
    print(f"page number = {currentpage}")
    for index,item in enumerate(outerDivs):
        title = item.find("h3" , class_= "opportunity-title").text.strip()

        #....some other codes for finding title and dates 

        # trying to click on the link
        driver.find_element_by_xpath(f"//*[@id='search-results']/div[{index 1}]/opportunities-result/div/div/div[1]/h3/a").click()      
    
        handles = driver.window_handles
        size = len(handles)
        print(f"length of handles  = {size}")
        parent_handle = driver.current_window_handle

        for x in range(size):
            if handles[x] != parent_handle:
                # trying to swith on the new window
                driver.switch_to.window(handles[x])
                print(driver.title)
                driver.close()
                break
        
        driver.switch_to.window(parent_handle)

       
        break
        
    break
  

Вы также можете увидеть фотографии, которые я прикрепил для получения дополнительной информации
введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Ответ №1:

Вместо того, чтобы нажимать на ссылку, попробуйте очистить ссылку и открыть ссылку на новой вкладке. Вот как вы это делаете:

 source = driver.page_source
soup = BeautifulSoup(source, 'lxml')
a_tags = soup.find_all('a',class_ = "wordbreak")
url_lst = []
for a in a_tags:
   url_lst.append("https://beta.sam.gov/"  a['href'])
print(url_lst)
  

Вывод:

 ['https://beta.sam.gov//opp/26d35e6fa6e64a8099cf37e592ea54d0/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/5a07648db5034fd590ce2d3526eea366/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/7fd9b43ec7734708b23f6cacb189bf7f/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/1a9d2d5d61ac4deba9d6cc973b684176/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/b7eb9430de724dd58bf9c4c76c0d8652/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/f70317667944475981fbcbfd52a6f86e/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/b39489e47c8a41c6801499de4d908dad/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/dcaa31871a174dd3a136b276dbf0040e/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/401b8fd7f2234ffcbf4476523413ba40/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1', 'https://beta.sam.gov//opp/7c61c39c6cd24d52bbb34feea9fcf69e/view?keywords=amp;sort=-modifiedDateamp;index=oppamp;is_active=trueamp;page=1']
  

Затем вы можете выполнить итерацию по этому списку, открыть все ссылки одну за другой на новой вкладке и выполнить нужное действие. Надеюсь, что это поможет!

Комментарии:

1. Отвечает ли это на ваш вопрос? И помогло ли это вам?

Ответ №2:

Вы можете сделать это, чтобы переключиться на новую вкладку и вернуться к родительскому.

 parent=driver.current_window_handle
#Use a for loop
   driver.execute_script("window.open('{0}', '_blank');".format(url))
   driver.switch_to.window(len(driver.window_handles)-1)
   #Do whatever you want
   driver.close()
   driver.switch_to.window(parent)
  

Комментарии:

1. зачем мне нужно использовать цикл for? что следует повторить?

2. У меня есть страница 1000, на каждой странице 10 разделов, и у каждого раздела есть одна ссылка, по которой я должен посетить ее и выполнить свою работу, и мне нужно вернуться к следующему разделу, снова открыть его ссылку, … для переключения первой страницы требуется 10 раз, а второй страницы снова 10 раз….

3. Если вы возьмете все ссылки href, вы можете просто зациклить их таким образом, чтобы перейти на их страницы и обратно.

4. Где URL-адрес является значением ahref.