按特定列拖动以对表python selenium进行排序 [英] Drag by specific column sort the table python selenium

查看:92
本文介绍了按特定列拖动以对表python selenium进行排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这样的html

链接到html

http://fileuploadios.s3-website-us-east- 1.amazonaws.com/

<style type="text/css">
                body {
              font-size: 14px;
            }

            .drag-handler {
              width: 8em;
              position: relative;
              background-color: #E4E6EB;
              background-image: linear-gradient(45deg, #E4E6EB, #E4E6EB 2px, #fff 2px, #fff 4px, #E4E6EB 4px, #E4E6EB 9px, #fff 9px, #fff 11px, #E4E6EB 11px, #E4E6EB 16px, #fff 16px, #fff 18px, #E4E6EB 18px, #E4E6EB 22px);
              background-size: 10px 20px;
              cursor: move;
              border-top: 2px solid #FFF;
              border-bottom: 2px solid #FFF;
            }

            .drag-handler:active {
              background-image: linear-gradient(45deg, #bab86c, #bab86c 2px, #fff 2px, #fff 4px, #bab86c 4px, #bab86c 9px, #fff 9px, #fff 11px, #bab86c 11px, #bab86c 16px, #fff 16px, #fff 18px, #bab86c 18px, #bab86c 22px);
              background-size: 10px 20px;
            }

</style>
<table class="table table-hover table-striped">
  <thead>
    <tr>
      <th>
        Drag Button
      </th>
      <th>
        Number
      </th>
      <th>
        Jabcode
      </th>
    </tr>
  </thead>

  <tbody id="sortable">
    <tr>
      <td class="ui-state-default drag-handler" ></td>
      <td>1</td>
        <td>E24.9</td>
    </tr>
    <tr>
      <td class="ui-state-default drag-handler" ></td>
      <td>2</td>
              <td>J92.9</td>
    </tr>
    <tr>
      <td class="ui-state-default drag-handler" ></td>
      <td>3</td>
              <td>A10.2</td>
    </tr>
        <tr>
      <td class="ui-state-default drag-handler" ></td>
      <td>4</td>
              <td>B10.2</td>
    </tr>
        <tr>
      <td class="ui-state-default drag-handler" ></td>
      <td>5</td>
              <td>C4.9</td>
    </tr>
        <tr>
      <td class="ui-state-default drag-handler" ></td>
      <td>6</td>
              <td>D10.11</td>
    </tr>
        <tr>
      <td class="ui-state-default drag-handler" ></td>
      <td>7</td>
              <td>F19.10</td>             
    </tr>
        <tr>
      <td class="ui-state-default drag-handler" ></td>
      <td>8</td>
      <td>Z20.2</td>
    </tr>
  </tbody>
</table>
    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> 
    <script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"></script> 
    <script src="https://getbootstrap.com/dist/js/bootstrap.min.js"></script>

<script type="text/javascript">
    $(document).ready(function() {

  $("#sortable").sortable({
    handle: ".drag-handler"
  });
  $("#sortable").disableSelection();

});

</script>

采用以下方式

我想根据我的python程序中的Jabcode对此进行重新排列

I want to rearrange this based on the Jabcode in my python program

jab_code_order =['J92.9','A10.2','E24.9','B10.2','F19.10','D10.11']

这是我的python代码

This is my python code

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time 

jab_code_order =['J92.9','A10.2','E24.9','B10.2','F19.10','D10.11']
lis = ["1","2","3",]



driver = webdriver.Chrome('chromedrivernew')
driver.get("file:////newhtml.html")

time.sleep(5)


def get_current_element_order():
    array_of_elements = driver.find_elements_by_xpath("//tbody//tr")
    return array_of_elements

for item in range(len(jab_code_order)):
    cell=driver.find_element_by_xpath("//tr[@class='ui-sortable-handle']//td[text()='"+ jab_code_order[item] + "']")
    # print(cell.text)
    source_element = driver.find_element_by_xpath("//tr[@class='ui-sortable-handle']//td[text()='"+ jab_code_order[item] + "']")
    current_order_of_elements = get_current_element_order()
    dest_element = current_order_of_elements[item]
    # print(dest_element)
    # children = source_element.find_elements_by_xpath('./*')
    # print(children)


    if dest_element.location['y'] - source_element.location['y'] < 0:
        # print(dest_element.location['y'])
        print("if")
        print(source_element,0,dest_element.location['y'] - source_element.location['y'] - 1)

        ActionChains(driver).drag_and_drop_by_offset(source_element,
                                                     0,
                                                     dest_element.location['y'] - source_element.location['y'] - 5).perform()
    else:
        print("else")
        ActionChains(driver).drag_and_drop_by_offset(source_element,
                                                     0,
                                                     dest_element.location['y'] - source_element.location['y']).perform()
    time.sleep(2)

我想要这样的输出

但是我当前的代码无法做到这一点,它试图进入Jabcode并试图拖动.基于jabcode,如何从tr中的第一个孩子中拖动表中的元素?

But my current code fails to do that it tries to go the Jabcode and tries to drag. Based on the jabcode how to drag the element in the table from the first child in the tr ?

帮助将不胜感激! 谢谢+

Help would be appreciated !! Thanks+

推荐答案

因此,这里的挑战是找到一种方法来将button元素映射到具有在变量jab_code_order中找到的文本的元素.

So the challenge here is finding a way to map the button element to the element with the text found in the variable jab_code_order.

我添加了一些帮助函数",它们每次都执行以获取新列表的顺序.也许不是最编程高效"的方法,但是可行.

I added a few "helper functions" that execute each time to get the order of the new list. Maybe not the most "programmiclly efficient" but works.

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome(executable_path=r'C:\Path\\To\\chromedriver.exe')

driver.get('file://C:\Path\\To\\newhtml.html')

time.sleep(2)


jab_code_order =['J92.9','A10.2','E24.9','B10.2','F19.10','D10.11']
lis = ["1","2","3",]

def get_current_element_order():
    array_of_elements = driver.find_elements_by_xpath("//tbody//tr")
    return array_of_elements

def map_text_lcation():
    text_array_to_return = []
    for element in get_current_element_order():
        text_array_to_return.append(element.text)
    return text_array_to_return


def get_current_button_order():
    get_current_button_order_dict = {}
    for iii in range(len(map_text_lcation())):
        for ii in get_current_element_order():
            a = driver.find_element_by_css_selector("tbody tr:nth-child({})".format(iii + 1))
            if ii.text == a.text:
                get_current_button_order_dict[ii.text] = driver.find_element_by_css_selector("tbody tr:nth-child({}) td:nth-child(1)".format(iii + 1))
    return get_current_button_order_dict

for item in range(len(jab_code_order)):
    element_dict = get_current_button_order()
    this_key = ""
    for key in element_dict:
        if jab_code_order[item] in key:
            this_key = key
    source_element = element_dict[this_key]
    current_order_of_elements = get_current_element_order()
    dest_element = current_order_of_elements[item]

    if dest_element.location['y'] - source_element.location['y'] < 0:
        print("if")
        print(source_element,0,dest_element.location['y'] - source_element.location['y'] - 1)

        ActionChains(driver).drag_and_drop_by_offset(source_element,
                                                     0,
                                                     dest_element.location['y'] - source_element.location['y'] - 5).perform()
    else:
        print("else")
        ActionChains(driver).drag_and_drop_by_offset(source_element,
                                                     0,
                                                     dest_element.location['y'] - source_element.location['y']).perform()
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"tbody tr:nth-child(1) td:nth-child(1)")))

这篇关于按特定列拖动以对表python selenium进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆