【问题标题】:Fill a table or list of values in textarea in website using Splinter使用 Splinter 在网站的 textarea 中填充表格或值列表
【发布时间】:2019-05-30 07:56:31
【问题描述】:

我正在尝试编写一个脚本来自动搜索多个条目。这是输入:

<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 列表中时,我得到的所有名称都是这样的:

&lt;mirna-1&gt;&lt;mirna-2&gt;&lt;mirna-3&gt;....

而正确的格式是每个名字都应该在下一行。这该怎么做。请建议。谢谢。

【问题讨论】:

    标签: python-3.x xpath splinter


    【解决方案1】:

    您可以使用Selenium Chrome Driverpython 填写此表格。如果您以前没有使用过硒并且想使用硒。但是这里是硒的official website


    install selenium 使用命令行

    pip install -U selenium


    您需要在compatibility的基础上从以下网站website Chromedriver下载chrome驱动程序,如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)
    

    输出:

    【讨论】:

    • 感谢您的回复。尽管您的答案非常正确,并且您试图给出完整的解决方案。我真的很感谢你的努力。上面的用户(@Lucky..)已经给出了答案。我没有检查就发表了评论。不是它的工作,他是第一个回答的人,所以他应得的。你也应该得到同样的待遇,但我不能给 2 个人 +50 [对此感到抱歉]。谢谢你的帮助。问题解决了。
    • @Lot_to_learn :我知道您不能接受两个答案,但您可以对答案进行投票,以便未来的读者可以根据需要使用它。
    【解决方案2】:

    虽然我会推荐 selenium 用于这样的事情,但您似乎想坚持使用 splinter。使用 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 中的每个字符串。

    【讨论】:

    • 感谢您这么多天后的回复。但不幸的是,我不能接受它作为正确答案,因为它不完整,正如我在声誉框中提到的那样。我用 splinter 开始了这个任务。因此,如果您推荐 selenium,我要求您完成其他任务的答案,例如1.选择miRNA列表,2.选择human,3.选择mirbase ID等等,继续[连续两次],最后只在selenium中以SVG格式保存网络图像。再次感谢。
    • @Lot_to_learn 抱歉,如果我的回答不清楚。尽管我推荐使用 selenium 执行此任务,但我提供的答案是使用 splinter。我的回答只是更正了填充 mRNA 列表的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多