Заполните таблицу или список значений в textarea на сайте, используя Splinter - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь написать скрипт для автоматизации поиска по нескольким записям. Вот входные данные:

<mirna-1>

<mirna-2>

<mirna-3>

:

: Адрес веб-сайта: https://www.mirnet.ca/miRNet/faces/upload/MirUploadView.xhtml Снимок экрана Как мне заполнить mirna-1, .... в окне списка miRNA. Я сделал следующие попытки, но потерпел неудачу:

gecko = os.path.normpath('~/geckodriver') nirnet_Results = []

browser = Browser(executable_path=gecko)

browser.visit('https://www.mirnet.ca/miRNet/faces/home.xhtml')

# click miRNA_list

xpath = '//*[@id="j_idt39:j_idt55"]'

browser.find_by_xpath(xpath).click()

time.sleep(1)

#Select Human

xpath = '//*[@id="form:j_idt34"]/div[3]/span'

browser.find_by_xpath(xpath).click()

time.sleep(1)

xpath = '//*[@id="form:j_idt34_1"]'

browser.find_by_xpath(xpath).click()

time.sleep(1)

# select miRBase ID type

xpath = '//*[@id="form:j_idt38"]/div[3]/span'

browser.find_by_xpath(xpath).click()

time.sleep(1)

xpath = '//*[@id="form:j_idt38_1"]'

browser.find_by_xpath(xpath).click()

time.sleep(1)

# select Tissue type

xpath = '//*[@id="form:sourceOpt"]/div[3]/span'

browser.find_by_xpath(xpath).click()

time.sleep(1)

xpath = '//*[@id="form:sourceOpt_1"]'

browser.find_by_xpath(xpath).click()

time.sleep(1)

# select target type

xpath = '//*[@id="form:targetOpts"]/div[3]/span'

browser.find_by_xpath(xpath).click()

time.sleep(1)

xpath = '//*[@id="form:targetOpts_1"]'

browser.find_by_xpath(xpath).click()

time.sleep(1)

# Fill miRNA list

xpath = '//*[@id="form:listData"]'

browser.find_by_xpath(xpath).click()

time.sleep(1)

for mir in known_mir:

`browser.fill('form:listData',mir)`

`browser.fill('form:listData','\n')`

Я получаю успешный выбор опций в выпадающем списке, и когда я пытаюсь вставить список имен в список miRNA, я получаю все имена, подобные этому:

<mirna-1><mirna-2><mirna-3>....

в то время как правильным форматом является каждое имя, которое должно отображаться в следующей строке. Как это сделать Пожалуйста, предложите. Благодаря.

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Вы можете заполнить эту форму, используя Selenium Chrome Driver и python. Если вы ранее не использовали селен и хотели бы использовать селен. Однако здесь находится официальный сайт селен.


Кому install Селен использовать командную строку

pip install -U селен


Вам необходимо скачать драйвер chrome со следующего веб-сайта веб-сайт Chromedriver на основе compatibility, например, chrome browser, поддерживаемый chrome driver. Всегда предпочитайте последние версии драйвера chrome и браузера chrome.


Вот код селена, который заполняет форму

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
driver=webdriver.Chrome('path to chrome driver exe')  #example : 'C:\chromedriver\chromedriver.exe'
driver.get("https://www.mirnet.ca/miRNet/faces/upload/MirUploadView.xhtml")

#select Organism here
WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID,"form:j_idt34_label"))).click()
time.sleep(2)
element=WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='ui-selectonemenu-items-wrapper']//ul[@id='form:j_idt34_items']//li[contains(.,'H. sapiens (human)')]")))
ActionChains(driver).move_to_element(element).send_keys(Keys.UP).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()

#select ID type here
WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID,"form:j_idt38_label"))).click()
time.sleep(2)
element=WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='ui-selectonemenu-items-wrapper']//ul[@id='form:j_idt38_items']//li[contains(.,'miRBase ID')]")))
ActionChains(driver).move_to_element(element).send_keys(Keys.UP).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()

#select Tissue here
WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID,"form:sourceOpt_label"))).click()
time.sleep(2)
element=WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='ui-selectonemenu-items-wrapper']//ul[@id='form:sourceOpt_items']//li[contains(.,'Exosomes [1250]')]")))
ActionChains(driver).move_to_element(element).send_keys(Keys.UP).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()

#select Target type here

WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID,"form:targetOpts_label"))).click()
time.sleep(2)
element=WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH,"//div[@class='ui-selectonemenu-items-wrapper']//ul[@id='form:targetOpts_items']//li[contains(.,'Genes')]")))
ActionChains(driver).move_to_element(element).send_keys(Keys.UP).send_keys(Keys.DOWN).send_keys(Keys.ENTER).perform()


items=['mirna-1','mirna-2','mirna-3','mirna-4']
for item in items:
   element=WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//textarea[@id='form:listData']")))
   element.send_keys(item)
   element.send_keys(Keys.RETURN)

Выход:

enter image description here

1 голос
/ 05 июня 2019

Хотя я бы порекомендовал селен для чего-то подобного, похоже, вы хотите придерживаться splinter. Следующее исправление с использованием сплинтера. При воспроизведении этой проблемы каждый раз при запуске browser.fill() он заменяет уже написанный текст. Поскольку вы не включили то, что known_mir было в вашем коде, я предполагаю, что это список (поправьте меня, если я ошибаюсь). Я попытался объединить то, что вы хотели поместить в форму, и это сработало.

Заменить:

for mir in known_mir:

    browser.fill('form:listData',mir)

    browser.fill('form:listData','\n')

С:

browser.fill('form:listData', '\n'.join(mir for mir in known_mir))

Все, что делает мой код, это объединяет каждую строку в known_mir.

...