Selenium Webdriver-Python不会在网站上单击按钮

时间:2019-03-22 16:00:38

标签: python-2.7 selenium selenium-webdriver

这是我关于堆栈溢出的第一个问题。我不是一个程序员,我只是了解了Selenium并尽了最大的努力,但是有一个我无法单独解决的错误,所以我寻求帮助。我在PyCharm中使用Python 2.7。

截至目前,我一直在使用any.send_keys(Keys.ENTER)单击代码中的某些按钮,因为.click()函数始终在Chrome中向我返回此网站的ElementNotInteractableException错误。这里的目标只是清除文本区域,在此处插入基因列表,然后单击此“提交”按钮。这应该向我显示了我要下载的更新表。

对于这个麻烦的按钮,没有任何作用。问题是,它甚至没有返回错误,代码一直在继续运行,好像它确实已经被单击一样,最终它下载了未更新的表。我尝试切换到Firefox,但.click()或.send_keys(Keys.ENTER)都不起作用(我也从未收到错误,它只是下载了错误的表)。单击我自己可以工作并生成更新的表。

基于我在这里看到的其他问题,我尝试使用ActionChains或scroll_into_view,但仍然没有任何反应。这是代码:

baseline_url = "http://mtsspdb.noble.org/atlas-internal/3880/transcript/profile/5?charttype=barchart&sessionid=1553076490500118&feature_accs=%20Medtr1g079760.1"
driver = webdriver.Chrome("C:\Webdrivers\chromedriver.exe")
driver.set_page_load_timeout(30)
driver.get(baseline_url)
driver.maximize_window()

peptides_list = """Medtr4g068220.1
Medtr1g107390.1
Medtr1g018740.1
Medtr5g016470.1
Medtr4g095002.1
Medtr5g004930.1
MT4Noble_020581.1
Medtr1g107395.1
Medtr1g107400.1
Medtr1g107405.1
Medtr1g107410.1
Medtr4g095010.1
MT4Noble_057127.1
"""
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, "//*[@id='feature_accs']")))
text_area = driver.find_element_by_xpath("//*[@id='feature_accs']")
text_area.clear()
text_area.send_keys(peptides_list)
time.sleep(1)
troublesome = driver.find_element_by_xpath("//*[@id='form1']/div[8]/div/input")
print troublesome
#scroll_into_view = troublesome.location_once_scrolled_into_view
ActionChains(driver).move_to_element(troublesome).send_keys(Keys.ENTER)

time.sleep(3)
print "Sucess for x"

此按钮的html位置是

    <input class="btn btn-primary" type="submit" name="submit" value="Submit">

您对如何单击它有任何想法,最主要的是为什么它不起作用?

非常感谢

PS:正如我之前所说,这是我的第一个问题。请告诉我是否需要更新/更改某些内容。

3 个答案:

答案 0 :(得分:0)

欢迎来到SO。这是单击按钮的选项。

选项1:使用javascript单击

driver.exeucte_script("arguments[0].click();",troublesome)

选项2:滚动到元素

troublesome.location_once_scrolled_into_view
troublesome.click()

答案 1 :(得分:0)

这肯定行得通,因为我刚刚根据您的信息尝试了

driver.execute_script("$('#form1').find('.btn-primary').click()")

现在,找到元素必定有些奇怪,因为Selenium如果无法单击会出错。因此,我们使用代码单击的元素必须不包含我们期望的事件。我正在进行更多调查,并将针对具体情况进行更新。

编辑: 有趣。提交按钮似乎没有普通的事件侦听器。

getEventListeners($(".btn-primary")[0]);
$._data($(".btn-primary")[0], "events");

这两个都不返回任何值。这似乎是造成硒问题的原因。点击并不会触发实际的提交。 Selenium不使用Javascript,也不使用真实的user32.dll(Windows ex)单击,因此它的行为并不总是与真实单击或javascript单击相同。

答案 2 :(得分:0)

这对我来说很好:

for i in range(1, 10):
    try:
        driver.find_element_by_xpath(
        f'/html/body/div[{i}]/div/div[2]/span[1]/span/span/input').click()
    except:
        pass